gpt4 book ai didi

multithreading - 工作线程没有消息循环(MFC,Windows)。我们可以使其接收消息吗?

转载 作者:行者123 更新时间:2023-12-03 13:21:53 27 4
gpt4 key购买 nike

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

最佳答案

似乎您需要一个线程,该线程可以处理来自另一个线程的多个消息。另一个线程将向该线程的消息队列添加消息。好吧,在这种情况下,您可以使用PeekMessage启动循环,最终将创建一个隐藏窗口,然后使用GetMessage获取消息。其他线程将使用带有线程ID的PostThreadMessage(具有Peek/GetMessage的线程)以及消息代码LPARAMWPARAM.
就像(语法上不正确):

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

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

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

但是...我建议您在 std::queue/deque或其他DS之上,有一个自己的类,您可以在其中添加 AddMessage/ PushMessagePopMessage(或您喜欢的任何名称)。您需要使用 SetEventWaitForSingleObject来触发循环中的新消息(请参阅 implementation here之一。您可以使其对一种数据类型通用,也可以使其成为模板类-支持任何数据类型(您的基础DS( queue)将使用相同的数据类型)。您也不必担心堆和删除操作,这种方式不太容易出错,但是您可能必须处理MT问题。

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

关于multithreading - 工作线程没有消息循环(MFC,Windows)。我们可以使其接收消息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6661645/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com