我假设我们致电SendMessage
& PostMessage
,邮件的处理顺序与调用的Send/PostMessage
相同。但正如document所说,如果当前线程是正确的,SendMessage
将执行该函数。
如果指定的窗口是由调用线程,窗口创建的 程序作为子程序立即调用。
所以在以下情况中:
PostMessage(currentThreadWindow, postMsg, ...) // line 1
SendMessage(currentThreadWindow, sendMsg...) // line 2
sendMsg
将在postMsg
之前处理。
消息是否传递给SendMessage
并PostMessage
保留订单?
答案 0 :(得分:3)
消息是否传递给
SendMessage
并PostMessage
保留订单?
如果您正在向调用线程拥有的窗口发送/发送消息,您已经知道了这个问题的答案:对SendMessage
的调用完全绕过消息队列,并立即调用窗口过程,因此,此消息将始终在发布消息之前处理。
如果您跨越线程边界,则不再获得任何保证。即使在当前位于消息队列中的任何消息之前调度入站的跨线程消息,也无法控制调用线程何时被抢占。如果它在PostMessage
和SendMessage
的调用之间被抢占,则可能在发送的消息之前处理发布的消息。如果呼叫线程没有在这些呼叫之间被抢占,您仍然无法获得任何保证。它取决于同时执行的接收线程,是否首先处理发布或发送的消息。
为了使事情进一步复杂化,线程也可以在其他时间接收消息(参见When can a thread receive window messages?)。在等待出局SendMessage
- 调用的结果时,线程仍将接收入站的跨线程消息。换句话说:在转到下一条消息之前,您甚至不能依赖于消息作为一个整体处理的事实。您的窗口程序需要为重新准备做好准备。
您可以依赖的是,保留了几条发布消息的相对顺序。如果您发布2条消息,则在第二条消息之前处理第一条消息。这些消息仍然可以穿插其他发布的消息。