线程消息之间的优先级

时间:2011-10-02 10:21:46

标签: c++ multithreading c++builder

虽然我在Borland C ++应用程序的上下文中引用了这个,但这个问题既适用于Borland,也适用于泛型。

在Borland C ++项目中,我观察到用户与GUI的交互(比如菜单项单击)的优先级低于使用Synchronize()委托给主线程的任务,即使用户交互发生了几毫秒之前。当主线程可用时,首先完成委托任务,然后执行与用户交互相对应的动作。工作线程将任务委托给主线程,并等待使用Synchronize()完成任务。所以我们可以将Synchronize()等同于SendMessage()。

我认为用户交互在消息队列中排队等待消息,同样应该是委派任务的情况。但是该任务如何首先执行?消息之间有优先权吗?

1 个答案:

答案 0 :(得分:1)

直到并包括C ++ Builder 5,Synchronize()确实调用了SendMessage()。但是在C ++ Builder 6中,Synchronize()被重写为不再使用SendMessage()(在CLX下支持Linux)。请求现在放在FIFO队列中,VCL定期调用CheckSynchronize()来处理队列。即使CLX已经死了,Synchronize()仍然使用相同的FIFO队列(多年来它已得到增强)。

除此之外,在使用SendMessage()的情况下,它确实具有更高的优先级。用户交互是将消息发布到主线程消息队列(又名PostMessage())。虽然SendMessage()直接转到窗口的wndproc,但是如果接收窗口的拥有线程执行消息处理(如果由不同的线程(曾经是Synchronize()的情况下)),则不会调用它。对主线程消息队列的待处理SendMessage()请求具有比到同一队列的待处理发布消息更高的优先级,因为在处理待处理的SendMessage()请求之前,其他线程/进程被阻塞。