Multithreading 工作线程没有';没有消息循环(MFC、windows)。我们能让它接收信息吗?
Mfc提供工作线程和UI线程。UI线程已启用消息接收功能(发送、发布)。是否可以让工作线程也接收消息 是的,您可以在工作线程上创建消息队列。您需要在该线程上运行消息泵。反复调用Multithreading 工作线程没有';没有消息循环(MFC、windows)。我们能让它接收信息吗?,multithreading,visual-c++,mfc,Multithreading,Visual C++,Mfc,Mfc提供工作线程和UI线程。UI线程已启用消息接收功能(发送、发布)。是否可以让工作线程也接收消息 是的,您可以在工作线程上创建消息队列。您需要在该线程上运行消息泵。反复调用CWinThread::PumpMessage(),直到它返回WM\u QUIT消息 您似乎需要一个线程,它可以处理来自另一个线程的多条消息。另一个线程将向该线程的消息队列添加消息。那么,在这种情况下,您可以使用PeekMessage启动一个循环,该循环最终将创建一个隐藏窗口,然后使用GetMessage获取消息。其他线程
CWinThread::PumpMessage()
,直到它返回WM\u QUIT
消息 您似乎需要一个线程,它可以处理来自另一个线程的多条消息。另一个线程将向该线程的消息队列添加消息。那么,在这种情况下,您可以使用PeekMessage
启动一个循环,该循环最终将创建一个隐藏窗口,然后使用GetMessage
获取消息。其他线程将使用带有线程ID的PostThreadMessage
(具有Peek/GetMessage的线程),以及消息代码LPARAM
,WPARAM.
它可能是(语法不正确):
线程将调用PostThreadMessage
——有关更多信息,请参阅MSDN。
当您需要发送的数据超过LPRAM/WPARAM所能容纳的数据量时,最终需要在堆上分配这些数据,然后在自定义消息循环中处理消息后删除这些数据。这将是笨重和马车
但是。。。我建议您在std::queue/deque
或其他DS上拥有自己的类,您可以在其中添加AddMessage
/PushMessage
和PopMessage
(或您喜欢的任何名称)。您需要使用SetEvent
,WaitForSingleObject
来触发循环中的新消息(请参阅其中一个。您可以将其设置为一种数据类型的通用类,或者将其设置为支持任何数据类型的模板类(您的底层DS(队列
)将使用相同的数据类型)。您也不必担心堆和删除。这不太容易出错。但是,您可能必须处理MT问题
使用Windows事件涉及内核模式转换(因为事件被命名为/kernel对象),并且您可能希望使用作为用户对象的条件变量。或者您可以直接使用VC10中提供的并发运行库中的
无界_buffer
类。请参阅(跳到无界_buffer
).那么为什么不使用UI线程呢?无论名称如何,都不必包含任何UI内容。事实上,比我更了解的人建议将所有UI内容都放在主线程中,因此UI线程将是“带有消息泵的辅助线程”。您将如何发送消息?sendmessage/postmessage需要窗口句柄。我相信postthreadmessage将完成这些操作。GetMessage可以完成这些操作。您可以将对CThread对象的引用传递给::postthreadmessage(),也可以调用CThread::postthreadmessage()。sendmessage()无法用于向其他线程发送消息。PostThreadMessage()仅将邮件放入队列。您无法知道correspondig操作是如何或何时完成的,因为线程异步处理邮件。如果试图将邮件发送到没有窗口可将其分派到的队列中,您会后悔。请创建一个隐藏窗口作为这些邮件的收件人。如果窗口句柄为NULL,则消息通过其消息映射发送到CWinThread派生类的成员函数?为什么要寻址窗口?CWinThread与CWnd具有相同的基类!请尝试CWinThread::PostMessage(),并将MSG结构的hwnd字段设置为NULL。在任何情况下,都不要调用CWnd::SendMessage()从另一个线程到一个窗口。事情可能会因此而变得一团糟。MFC的调试版本将断言。GetMessage可以完成这些事情。
TheProcessor()
{
MSG msg;
PeekMessage(&msg,...);
while(GetMessage(&msg...)
{ /* switch case here */ }
}