线程消息之间的优先级

Priority between thread messages?

本文关键字:优先级 之间 消息 线程      更新时间:2023-10-16

虽然我在Borland c++应用程序的上下文中引用了这一点,但这个问题既针对Borland,又具有普遍性。

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

我认为用户交互作为消息队列中的消息排队,委托任务也应该如此。但是任务是如何首先执行的呢?消息之间是否有优先级?

直到并包括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()请求被处理。