【发布时间】:2022-01-21 12:12:54
【问题描述】:
我用 Win32s 创建了一个窗口,我希望它除了可以处理典型的 windows 消息外,还可以处理来自另一个线程的传入消息。
我正在使用这段代码:
while (dataAvailable || GetMessage(&msg, nullptr, 0, 0))
{
// if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
if (dataAvailable == true)
{
cout << "My thread message/signal!" << endl;
dataAvailable = false;
}
else
{
//Windows message
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
“DataAvailable”是一个原子布尔值,当我想将自己的消息传递给 win32 应用程序/windows 时设置。
这不好用。
可以这样做吗?
【问题讨论】:
-
使用 PostMessage (docs.microsoft.com/en-us/windows/win32/api/winuser/…) 从后台线程发送消息 (docs.microsoft.com/en-us/windows/win32/winmsg/wm-user) 到线程(具有消息泵的线程)。您可能需要将 HWND 从线程传递到后台线程,以便它知道将消息发送到哪里。我知道这不是最快的响应方式,但实际上,在使用消息队列时,您总是会处理额外的延迟
-
另一种选择是运行基于
MsgWaitForMultipleObjects的消息泵。此函数等待消息到达或一个或多个内核对象(例如事件,请参阅CreateEvent)发出信号,以先到者为准。
标签: c++ windows multithreading event-handling win32gui