工作线程没有消息循环(MFC,windows)。我们可以让它接收消息吗?

时间:2011-07-12 08:52:10

标签: multithreading visual-c++ mfc

Mfc提供了工作线程和UI线程。 UI线程启用了消息接收功能(发送,发布)。是否可以让工作线程也接收消息。

3 个答案:

答案 0 :(得分:2)

重复调用CWinThread::PumpMessage(),直到它返回WM_QUIT条消息。

答案 1 :(得分:1)

似乎你需要一个可以处理来自其他线程的多条消息的线程。另一个线程会向该线程的消息队列添加一条消息。那么,在这种情况下,你可以使用PeekMessage来启动一个循环,这最终会创建一个隐藏的窗口,然后使用GetMessage来获取消息。其他线程将PostThreadMessage与线程ID(具有Peek / GetMessage的线程)和消息代码LPARAMWPARAM.

一起使用

这就像(在语法上不正确):

TheProcessor()
{
    MSG msg;
    PeekMessage(&msg,...);

    while(GetMessage(&msg...)
    {    /* switch case here */ }
}

线程将调用PostThreadMessage - 有关详细信息,请参阅MSDN。 当您需要发送比LPARAM / WPARAM可以容纳的更多数据时,您最终需要在堆上分配它们,然后在自定义消息循环中删除AFTER处理消息。这将是麻烦和错误。

但是......我建议您在std::queue/deque或其他DS之上拥有自己的课程,您可以在其中添加AddMessage / PushMessage和{{1} (或者你喜欢的任何名字)。您需要使用PopMessageSetEvent来循环触发新消息(请参阅implementation here之一。您可以将其设置为一个数据类型的通用,或使其成为模板类 - 这将支持任何数据类型(您的基础DS(WaitForSingleObject)将使用相同的数据类型。)您也不必担心堆和删除。这不容易出错。但是,您可能必须处理MT问题。

使用Windows事件涉及内核模式转换(因为事件被命名为/ kernel对象),并且您可能希望使用作为用户对象的条件变量。或者您可以直接使用来自并发运行时库的queue类VC10。请参阅this article(跳转到unbounded_buffer)。

答案 2 :(得分:0)

是的,您可以在工作线程上创建消息队列。您需要在该线程上运行消息泵。