线程消息之间的优先级
Priority between thread messages?
虽然我在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()
请求被处理。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- C++ SFINAE - 标准::is_arithmetic 和标准::is_same之间的分辨率优先级
- 优先级队列使用堆 - JavaScript和C 实现之间的差异
- 有没有办法在两个ROS节点之间具有优先级
- C++中转换运算符之间的优先级
- 具有相同名称的不同函数模板之间的重载优先级
- 普通函数和模板函数之间的优先级
- 减少具有相同优先级的线程之间的上下文切换
- 线程消息之间的优先级
- 序列点和操作符优先级之间的差异?0 _o
- 混淆了定义自定义优先级队列和使用C++中的make_heap等方法初始化堆之间的区别