我想做的是让一个线程等待消息(WaitMessage
),另一个线程处理应用程序的逻辑。第一个线程会在每条消息上唤醒,以某种方式向另一个线程发出此事件的信号,再次进入睡眠状态等等。这可能吗?
更新
考虑以下情况。我们有一个GUI线程,这个线程忙于长时间的计算。如果没有其他线程,则除了不时检查新消息之外别无选择。否则,在长时间计算期间GUI将变得无响应。现在我的系统使用这种“轮询”方法(它有一个单独的线程,不时检查消息队列。)但是,我想知道这个其他解决方案是否可行:让另一个线程等待OS消息队列GUI的消息,当Windows消息到达时,该线程将唤醒并告诉对方有关该消息。请注意,我不是问如何在线程之间传递新闻,而是第二个线程是否有可能等待到达第一个线程队列的OS消息。
我还应该补充一点,我不能有两个不同的线程,一个用于GUI,另一个用于计算,因为我正在处理的系统是一个虚拟机,在其上运行一个非线程安全的Smalltalk映像。这就是为什么只有一个只发出新OS消息信号的线程才是理想的解决方案(如果可能的话)。
答案 0 :(得分:2)
这取决于第一个线程收到消息后第二个线程需要做什么。
如果第二个线程只需要知道第一个线程收到了一条消息,那么第一个线程可以使用Event object或SetEvent()
发信号通知PulseEvent()
,第二个线程可以等待事件使用WaitForSingleObject()
。
如果第二个线程需要第一个线程的数据,则可以使用I/O Completion Port。第一个线程可以将数据包装在动态分配的结构中,并使用PostQueuedCompletionStatus()
将其发布到端口,第二个线程可以使用GetQueuedCompletionStatus()
等待数据,然后在使用它时释放它。 / p>
更新:根据您提供的新信息,一个线程无法等待或服务另一个线程的消息队列。只有创建并拥有该队列的线程才能从其队列中轮询消息。每个线程都有自己的消息队列。
你真的需要将你的长计算移动到另一个线程,它们不属于GUI线程开始。让GUI线程管理GUI和服务消息,在另一个线程中执行任何长时间运行的事情。
如果你不能这样做,因为你选择的库不是线程安全的,那么你有4个选择:
找到一个线程安全的不同库。
在GUI线程中运行时,计算周期性地轮询消息队列。
将计算分解为可以由GUI线程向其自身发布消息的小块。发布消息并返回消息循环。收到消息后,执行一些工作,发布下一条消息,然后返回消息循环。根据需要重复,直到工作完成。这允许GUI线程在每个计算步骤之间继续为消息队列提供服务。
将库移动到一个单独的进程,根据需要与主应用程序进行通信。