2011-10-02 122 views
0

虽然我在Borland C++应用程序的背景下引用了它,但是这个问题既是Borland特有的,也是通用的。在一个Borland C++项目中,我观察到用户与GUI的交互(比如菜单项点击)的优先级低于使用Synchronize()委托给主线程的任务,尽管用户交互正在发生几毫秒前。当主线程可用时,首先完成委托任务,然后执行与用户交互对应的操作。工作者线程将任务委托给主线程,并使用Synchronize()等待任务完成。所以我们可以将Synchronize()等同于SendMessage()。线程消息之间的优先级?

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

+0

这对于Borland的实现非常具体。但是,消息循环首先分派来自同步队列的任何请求,然后继续清空消息队列是很常见的。 –

+0

@Hans感谢您的回复。我对文本进行了一些修改 - “主线程可用时”。不知道这是否重要,以防万一。 –

回答

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()请求之前,还有其他线程/进程被阻塞。

+0

Lebeau。谢谢回复。我认为Synchronize()的FIFO与GUI线程的消息队列不同,前者比后者更优先。 GUI线程也会在空闲时执行消息处理。那是对的吗? –

+0

从BCB6开始,FIFO队列与消息队列是分开的,是的。由于'Synchronize()'不再使用消息队列进行同步,现在它实际上具有较低的优先级。主线程在空闲时以及收到“WM_NULL”消息时调用“CheckSynchronize()”。 'Synchronize()'向主消息队列发布'WM_NULL'消息来唤醒主线程,让它知道'CheckSynchronize()'需要很快被调用。这与旧的'SendMessage()'逻辑非常不同(但更具可移植性)。 –

+0

感谢您的回复。我现在有点困惑。 Synchronize()现在依赖于发送到消息队列的WM_NULL消息,并且用户交互也会发布到此消息队列中。 Synchronize()如何在运行Borland版本6的项目中看到更高的优先级? –