Mfc提供了工作线程和UI线程。 UI线程启用了消息接收功能(发送,发布)。是否可以让工作线程也接收消息。
答案 0 :(得分:2)
重复调用CWinThread::PumpMessage()
,直到它返回WM_QUIT
条消息。
答案 1 :(得分:1)
似乎你需要一个可以处理来自其他线程的多条消息的线程。另一个线程会向该线程的消息队列添加一条消息。那么,在这种情况下,你可以使用PeekMessage
来启动一个循环,这最终会创建一个隐藏的窗口,然后使用GetMessage
来获取消息。其他线程将PostThreadMessage
与线程ID(具有Peek / GetMessage的线程)和消息代码LPARAM
,WPARAM.
这就像(在语法上不正确):
TheProcessor()
{
MSG msg;
PeekMessage(&msg,...);
while(GetMessage(&msg...)
{ /* switch case here */ }
}
线程将调用PostThreadMessage
- 有关详细信息,请参阅MSDN。
当您需要发送比LPARAM / WPARAM可以容纳的更多数据时,您最终需要在堆上分配它们,然后在自定义消息循环中删除AFTER处理消息。这将是麻烦和错误。
但是......我建议您在std::queue/deque
或其他DS之上拥有自己的课程,您可以在其中添加AddMessage
/ PushMessage
和{{1} (或者你喜欢的任何名字)。您需要使用PopMessage
,SetEvent
来循环触发新消息(请参阅implementation here之一。您可以将其设置为一个数据类型的通用,或使其成为模板类 - 这将支持任何数据类型(您的基础DS(WaitForSingleObject
)将使用相同的数据类型。)您也不必担心堆和删除。这不容易出错。但是,您可能必须处理MT问题。
使用Windows事件涉及内核模式转换(因为事件被命名为/ kernel对象),并且您可能希望使用作为用户对象的条件变量。或者您可以直接使用来自并发运行时库的queue
类VC10。请参阅this article(跳转到unbounded_buffer
)。
答案 2 :(得分:0)
是的,您可以在工作线程上创建消息队列。您需要在该线程上运行消息泵。