Windows消息队列是否以FIFO方式处理消息?

时间:2016-04-14 04:26:32

标签: windows winapi message message-queue

我假设我们致电SendMessage& PostMessage,邮件的处理顺序与调用的Send/PostMessage相同。但正如document所说,如果当前线程是正确的,SendMessage将执行该函数。

  

如果指定的窗口是由调用线程,窗口创建的   程序作为子程序立即调用。

所以在以下情况中:

PostMessage(currentThreadWindow, postMsg, ...) // line 1
SendMessage(currentThreadWindow, sendMsg...) // line 2

sendMsg将在postMsg之前处理。

消息是否传递给SendMessagePostMessage保留订单?

1 个答案:

答案 0 :(得分:3)

  

消息是否传递给SendMessagePostMessage保留订单?

如果您正在向调用线程拥有的窗口发送/发送消息,您已经知道了这个问题的答案:对SendMessage的调用完全绕过消息队列,并立即调用窗口过程,因此,此消息将始终在发布消息之前处理。

如果您跨越线程边界,则不再获得任何保证。即使在当前位于消息队列中的任何消息之前调度入站的跨线程消息,也无法控制调用线程何时被抢占。如果它在PostMessageSendMessage的调用之间被抢占,则可能在发送的消息之前处理发布的消息。如果呼叫线程没有在这些呼叫之间被抢占,您仍然无法获得任何保证。它取决于同时执行的接收线程,是否首先处理发布或发送的消息。

为了使事情进一步复杂化,线程也可以在其他时间接收消息(参见When can a thread receive window messages?)。在等待出局SendMessage - 调用的结果时,线程仍将接收入站的跨线程消息。换句话说:在转到下一条消息之前,您甚至不能依赖于消息作为一个整体处理的事实。您的窗口程序需要为重新准备做好准备。

您可以依赖的是,保留了几条发布消息的相对顺序。如果您发布2条消息,则在第二条消息之前处理第一条消息。这些消息仍然可以穿插其他发布的消息。