来自另一个线程的 SendMessage() 调用是否将消息发布到消息队列
Does a SendMessage() call from another thread posts a message to the message queue?
我读过两个关于从另一个线程调用SendMessage()
的矛盾概念:
-
首先是消息将发布到消息队列。
-
二是直接调用
SendMessage()
。但是,调用线程将阻塞,上下文切换到 UI 线程,然后调用窗口过程,当它返回时,调用线程被取消阻止,上下文切换回它。
那么哪一个是正确的呢?
在我看来,SendMessage
的文档相当清晰:
如果指定的窗口是由调用线程创建的,则窗口过程将立即作为子例程调用。如果指定的窗口是由其他线程创建的,则系统会切换到该线程并调用相应的窗口过程。仅当接收线程执行消息检索代码时,才会处理线程之间发送的消息。发送线程将被阻止,直到接收线程处理消息。
使用 SendMessage
发送的消息永远不会放在消息队列中。换句话说,你的第一个要点是完全错误的。
在跨线程发送消息的情况下,该消息将在拥有窗口的线程中调度,通常是通过调用收件人线程的消息循环中的GetMessage
。还有其他功能,例如 PeekMessage
、SendMessage
等,这将调度消息。
相关文章:
- 如何判断SSL_read是否已经接收并处理了来自单个消息的所有记录
- MFC 中的窗口消息管理:添加基类调用是否是强制性的?
- 如何检查提升消息队列是否存在
- 我们是否可以使用 FireBase 云消息传递来发送或接收消息,或者在 Windows 桌面/控制台或 Linux 控制
- 是否有 G++ 7.2 选项在使用预编译头文件时发出消息?
- 当试图检测基类是否具有虚拟破坏者时,如何获取正确的编译器错误消息
- 是否有任何消息总是出现在WM_LBUTTONDOWN和WM_LBUTTNUP之间
- Win32 中是否有一条消息或通知来检测用户何时更改区域设置?
- 是否可以删除应用程序接收到的触摸消息(WM_POINTERDOWN等)
- 异常是否应具有标志/消息,或者每个错误应具有异常类型
- 是否可以阻止从 SendMessage() 调用发送的消息
- 来自另一个线程的 SendMessage() 调用是否将消息发布到消息队列
- 是否可以进行编译,以使错误的std::vector访问调用退出程序,并显示有用的错误消息
- 是否可以在 protobuf 中发送编译的 protobuf 消息定义
- 这是否可以挂接子进程发送到 Windows 控制台的消息
- Boost:是否存在用于仅线程通信的进程间消息队列机制
- 对话框消息是否发送到自定义消息循环
- 是否可以捕获翻译/调度消息循环中的窗口消息/事件
- 如何判断我的 ActiveMQ 消息是否已传递到最终目的地
- 此错误消息是否正确:非类型模板参数不是常量表达式