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

线程消息之间的优先级? 虽然我在Borland C++应用的背景下引用了这个,但是这个问题既有Borland的特性,也有一般的性质。 在Borland C++项目中,我观察到用户与GUI的交互(比如说菜单项点击)比使用同步()的委托给主线程的任务少,即使用户交互在几毫秒之前发生。当主线程可用时,首先完成委托任务,然后执行与用户交互相对应的操作。工作线程将任务委托给主线程,并使用Synchronize()等待任务完成。所以我们可以将Synchronize()等同于SendMessage(),c++,multithreading,c++builder,C++,Multithreading,C++builder,我认为,用户交互作为消息队列中的消息排队,委托任务也应该如此。但是任务首先是如何执行的呢?消息之间有优先级吗?在C++Builder 5之前(包括C++Builder 5),Synchronize()确实调用了SendMessage()。但是在C++Builder 6中,Synchronize()被重新编写为不再使用SendMessage()(以支持CLX下的Linux)。请求现在放入FIFO队列,VCL定期调用CheckSynchronize()来处理队列。即使CLX早就死了,Synchron

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

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


除此之外,在使用
SendMessage()
的情况下,它确实具有更高的优先级。用户交互将消息发布到主线程消息队列(aka
PostMessage()
)。虽然
SendMessage()
直接进入窗口的wndproc,但在接收窗口的所属线程执行消息处理(如果由其他线程发送)之前,不会调用它(在
Synchronize()
中曾是这种情况)。发送到主线程消息队列的挂起的
SendMessage()
请求比发送到同一队列的挂起的消息具有更高的优先级,因为在处理挂起的
SendMessage()
请求之前,还有其他线程/进程被阻止。

这对于Borland实现来说非常特殊。但是消息循环通常首先从同步队列中分派任何请求,然后继续清空消息队列。@Hans感谢您的回复。我对问题文本做了一点修改——“当主线程可用时”。我不知道这是否重要,只是以防万一。谢谢你的回复。我猜Synchronize()的FIFO与GUI线程的消息队列不同,前者的优先级高于后者?当GUI线程空闲时,它也将执行消息处理。是吗?从BCB6开始,FIFO队列与消息队列是分开的,是的。由于
Synchronize()
不再使用消息队列进行同步,因此它现在的优先级实际上较低。当主线程处于空闲状态并且接收到
WM_NULL
消息时,主线程调用
CheckSynchronize()
Synchronize()
WM_NULL
消息发布到主消息队列,以“唤醒”主线程,让它知道需要尽快调用
CheckSynchronize()
。这与旧的
SendMessage()
逻辑非常不同(但更便于移植)。感谢您的回复。我现在有点困惑。Synchronize()现在依赖于发送到消息队列的WM_NULL消息,并且用户交互也发送到此消息队列。在运行Borland版本6的项目中,Synchronize()如何获得更高的优先级?正如我所说,BCB6+中的
Synchronize()
本身并不依赖于
WM_NULL
。消息队列空闲时,也会处理挂起的请求。因此,
Synchronize()
队列完全有可能在用户交互消息到达消息队列之前得到处理。