PostMessage()消息是否在Windows中按顺序出现?

时间:2011-09-15 18:31:36

标签: windows mfc postmessage

一般的问题是,如果我从一个单独的工作线程向Windows消息泵发送几条消息,它们会按照我发送的顺序出现在目的地吗?即..

::PostMessage(m_hUsers, WM_BULKPROCESS, 0, 0);
// ... some processing here ...
::PostMessage(m_hUsers, WM_BULKDONE, 0, 0);

m_hUsers是窗口的句柄(HWND)我正在从我的工作线程发送消息。因此,WM_BULKPROCESS将始终首先显示在窗口中(因此由该对话框类中的处理程序处理),或者它们是否可能出现故障,即WM_BULKDONE在WM_BULKPROCESS之前得到处理,即使它是最后发送的?

4 个答案:

答案 0 :(得分:5)

有一些例外(如WM_PAINT),但通常会保留消息的顺序。 如果消息以错误的顺序出现,想要尝试理解鼠标输入的成像!

来自GetMessage的引用

  

在此次通话期间,系统会发送待处理的非排队消息,   也就是说,发送到调用线程所拥有的窗口的消息使用   SendMessage,SendMessageCallback,SendMessageTimeout或   SendNotifyMessage函数。然后匹配的第一个排队的消息   检索指定的过滤器。系统也可以处理   内部事件。如果未指定过滤器,则处理消息   以下顺序:

Sent messages
Posted messages
Input (hardware) messages and system internal events
Sent messages (again)
WM_PAINT messages
WM_TIMER messages

答案 1 :(得分:2)

窗口消息存储在队列中。所以你可以依靠FIFO机制。

答案 2 :(得分:1)

它们应该是除非你在消息泵中有代码(有意或无意地)不同地发送消息,例如,以某种方式挑选两条消息,并将它们按顺序发送。通常,程序员按照从队列中获取的顺序为每条消息调用DispatchMessage。

答案 3 :(得分:0)

我怀疑问题是同步而不是消息队列。如果您的代码允许对工作线程proc进行多方调用,则必须更严格地管理它以了解工作线程的哪个“实例”正在发布消息。

您是否检查过确保一次只执行一个工作线程,或者保护m_hUsers窗口句柄在BULKPROCESS和BULKDONE之间不被更改?

SendMessage对于管理BULKDONE非常有用,因为它会一直阻塞,直到消息处理完毕,允许调用工作线程的代码同步工作线程的调用,并真正知道一个工作线程在调用另一个工作线程之前已经完成了。 Postmessage不会阻止,但记住工作线程的时间敏感部分  `// ......这里有一些处理...... 不发送Windows消息。