来自另一个线程的 SendMessage() 调用是否将消息发送到消息队列?

2 c c++ winapi

我读过关于SendMessage()从另一个线程调用的两个相互矛盾的概念:

  • 第一个是将消息发布到消息队列中。

  • 第二个是SendMessage()直接调用。但是,调用线程会阻​​塞,上下文切换到UI线程,然后窗口过程被调用,当它返回时,调用线程被解除阻塞,上下文切换回它。

那么哪一个是正确的呢?

Dav*_*nan 5

在我看来,该文档SendMessage相当清楚:

如果指定的窗口是由调用线程创建的,则立即将窗口过程作为子例程调用。如果指定的窗口是由不同的线程创建的,系统将切换到该线程并调用适当的窗口过程。仅当接收线程执行消息检索代码时,才会处理线程之间发送的消息。发送线程被阻塞,直到接收线程处理消息。

发送的消息SendMessage永远不会放入消息队列中。换句话说,你的第一个要点是完全错误的。

在跨线程发送消息的情况下,通常通过调用GetMessage接收者线程的消息循环来在拥有窗口的线程中分派消息。还有其他函数,例如PeekMessageSendMessage,将调度消息。

  • @IInspectable 没什么。问题是由于松散的实施影响而产生的 FUD。例如,“系统切换到该线程”强烈暗示该切换是 SendMessage 调用的主动操作(事实并非如此,因为目标线程必须能够响应所使用的任何信号)。 (2认同)