【发布时间】:2016-03-10 08:33:21
【问题描述】:
我想做的是让一个线程等待消息(WaitMessage),另一个线程处理应用程序的逻辑。第一个线程会在每条消息上醒来,以某种方式将此事件通知给另一个线程,再次进入睡眠状态,等等。这可能吗?
更新
考虑以下情况。我们有一个 GUI 线程,这个线程忙于长时间的计算。如果没有其他线程,则别无选择,只能不时检查新消息。否则,GUI 将在长时间计算期间变得无响应。现在我的系统使用这种“轮询”方法(它有一个不时检查消息队列的线程。)但是,我想知道这个其他解决方案是否可行:让另一个线程在 OS 消息队列上等待的 GUI,以便当 Windows 消息到达时,该线程将唤醒并告诉其他人有关该消息的信息。请注意,我不是在问如何在线程之间传递消息,而是第二个线程是否有可能等待操作系统消息到达第一个线程的队列。
我还应该补充一点,我不能有两个不同的线程,一个用于 GUI,另一个用于计算,因为我正在处理的系统是一个虚拟机,其上运行的 Smalltalk 图像不是线程安全的.这就是为什么拥有一个只发出新操作系统消息信号的线程将是理想的解决方案(如果可能的话)。
【问题讨论】:
-
这样做有什么意义?那只会使您的程序更复杂,更慢。它不能带来任何好处。
-
@DavidHeffernan 简短的回答是:确保应用程序在忙于一些冗长的计算时也能响应;另外,我宁愿避免拉事件。为什么你认为等待线程会减慢执行速度?
-
不要将消息发送到 GUI 线程
-
你真的需要将你的长计算移动到不同的线程,它们一开始就不属于 GUI 线程。让 GUI 线程管理 GUI 和服务消息,在另一个线程中执行任何长时间运行的事情。如果你不能这样做,因为你的库不是线程安全的,那么你有 4 个选项 - 1)找到一个线程安全的库,2)让计算定期轮询消息队列,3)将计算分解成小块可以通过向自己发布消息来触发,或者 4) 将库移动到与您的主应用程序通信的单独进程。
-
一个线程不可能等待和服务另一个线程的消息队列。
标签: windows multithreading winapi