Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 工作线程没有';没有消息循环(MFC、windows)。我们能让它接收信息吗?_Multithreading_Visual C++_Mfc - Fatal编程技术网

Multithreading 工作线程没有';没有消息循环(MFC、windows)。我们能让它接收信息吗?

Multithreading 工作线程没有';没有消息循环(MFC、windows)。我们能让它接收信息吗?,multithreading,visual-c++,mfc,Multithreading,Visual C++,Mfc,Mfc提供工作线程和UI线程。UI线程已启用消息接收功能(发送、发布)。是否可以让工作线程也接收消息 是的,您可以在工作线程上创建消息队列。您需要在该线程上运行消息泵。反复调用CWinThread::PumpMessage(),直到它返回WM\u QUIT消息 您似乎需要一个线程,它可以处理来自另一个线程的多条消息。另一个线程将向该线程的消息队列添加消息。那么,在这种情况下,您可以使用PeekMessage启动一个循环,该循环最终将创建一个隐藏窗口,然后使用GetMessage获取消息。其他线程

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

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

反复调用
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 */ }
}