一般的问题是,如果我从一个单独的工作线程向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之前得到处理,即使它是最后发送的?
答案 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消息。