虽然我在Borland C ++应用程序的上下文中引用了这个,但这个问题既适用于Borland,也适用于泛型。
在Borland C ++项目中,我观察到用户与GUI的交互(比如菜单项单击)的优先级低于使用Synchronize()委托给主线程的任务,即使用户交互发生了几毫秒之前。当主线程可用时,首先完成委托任务,然后执行与用户交互相对应的动作。工作线程将任务委托给主线程,并等待使用Synchronize()完成任务。所以我们可以将Synchronize()等同于SendMessage()。
我认为用户交互在消息队列中排队等待消息,同样应该是委派任务的情况。但是该任务如何首先执行?消息之间有优先权吗?
答案 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()
请求之前,其他线程/进程被阻塞。