2016-04-14 174 views
0

我假设当我们呼叫SendMessage & PostMessage时,消息的处理顺序与调用的Send/PostMessage相同。但是如document所示,如果当前线程是正确的,则SendMessage将执行该函数。Windows消息队列是否以FIFO方式处理消息?

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

因此,在下面的情况:

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

sendMsgpostMsg前处理。

那么消息传递给SendMessagePostMessage保持顺序?

+0

您已经举了一个例子,其中没有维护订单。不确定你的问题是什么。 –

+0

@Raymond Chen,那么有没有关于消息顺序处理的任何细节评论?我们有很多合乎逻辑的顺序。例如,如果海报不是目标线程本身,订单是否会保留。 – ZijingWu

+0

如果你穿过线程,你会得到更少的保证。您示例的消息可以按任意顺序接收。您得到的唯一保证是,如果消息队列中没有任何优先级较高的消息,则将分派低优先级消息。 – IInspectable

回答

3

那么消息传递给SendMessagePostMessage保持顺序?

你已经知道这个问题的答案,如果您要发送/发布的消息由调用线程拥有一个窗口:以SendMessage呼叫完全绕过消息队列,并立即调用窗口过程,所以此消息将始终在发布消息之前处理。

如果您穿越线程界限,则不再有任何保证。即使在消息队列中当前的任何消息之前调度了入境跨线程消息,但您无法控制调用线程何时被抢占。如果它在PostMessageSendMessage的呼叫之间被抢占,则发送的消息很可能在发送的消息之前被处理。如果调用线程在这些调用之间没有被抢占,你仍然没有得到任何保证。它取决于并发执行的接收线程,是先发送还是发送消息。

使事情进一步复杂化,线程也可以在其他时间接收消息(请参阅When can a thread receive window messages?)。在等待出线结果SendMessage-调用时,线程仍然会接收入站跨线程消息。换句话说:在转向下一条消息之前,你甚至不能依靠这样的事实,即将消息作为一个整体来处理。你的窗口程序需要准备重入。

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