是否可以在两个线程之间共享相同的消息队列?

时间:2015-12-05 12:15:15

标签: windows multithreading winapi

我想做的是让一个线程等待消息(WaitMessage),另一个线程处理应用程序的逻辑。第一个线程会在每条消息上唤醒,以某种方式向另一个线程发出此事件的信号,再次进入睡眠状态等等。这可能吗?

更新

考虑以下情况。我们有一个GUI线程,这个线程忙于长时间的计算。如果没有其他线程,则除了不时检查新消息之外别无选择。否则,在长时间计算期间GUI将变得无响应。现在我的系统使用这种“轮询”方法(它有一个单独的线程,不时检查消息队列。)但是,我想知道这个其他解决方案是否可行:让另一个线程等待OS消息队列GUI的消息,当Windows消息到达时,该线程将唤醒并告诉对方有关该消息。请注意,我不是问如何在线程之间传递新闻,而是第二个线程是否有可能等待到达第一个线程队列的OS消息。

我还应该补充一点,我不能有两个不同的线程,一个用于GUI,另一个用于计算,因为我正在处理的系统是一个虚拟机,在其上运行一个非线程安全的Smalltalk映像。这就是为什么只有一个只发出新OS消息信号的线程才是理想的解决方案(如果可能的话)。

1 个答案:

答案 0 :(得分:2)

这取决于第一个线程收到消息后第二个线程需要做什么。

如果第二个线程只需要知道第一个线程收到了一条消息,那么第一个线程可以使用Event objectSetEvent()发信号通知PulseEvent(),第二个线程可以等待事件使用WaitForSingleObject()

如果第二个线程需要第一个线程的数据,则可以使用I/O Completion Port。第一个线程可以将数据包装在动态分配的结构中,并使用PostQueuedCompletionStatus()将其发布到端口,第二个线程可以使用GetQueuedCompletionStatus()等待数据,然后在使用它时释放它。 / p>

更新:根据您提供的新信息,一个线程无法等待或服务另一个线程的消息队列。只有创建并拥有该队列的线程才能从其队列中轮询消息。每个线程都有自己的消息队列。

你真的需要将你的长计算移动到另一个线程,它们不属于GUI线程开始。让GUI线程管理GUI和服务消息,在另一个线程中执行任何长时间运行的事情。

如果你不能这样做,因为你选择的库不是线程安全的,那么你有4个选择:

  1. 找到一个线程安全的不同库。

  2. 在GUI线程中运行时,计算周期性地轮询消息队列。

  3. 将计算分解为可以由GUI线程向其自身发布消息的小块。发布消息并返回消息循环。收到消息后,执行一些工作,发布下一条消息,然后返回消息循环。根据需要重复,直到工作完成。这允许GUI线程在每个计算步骤之间继续为消息队列提供服务。

  4. 将库移动到一个单独的进程,根据需要与主应用程序进行通信。