【问题标题】:Do PostMessage() messages appear in order in Windows?PostMessage() 消息在 Windows 中是否按顺序显示?
【发布时间】:2011-09-15 18:31:35
【问题描述】:

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

【问题讨论】:

    标签: windows mfc postmessage


    【解决方案1】:

    有一些例外(如 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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-09-06
            • 2016-04-29
            • 1970-01-01
            • 2021-07-14
            • 1970-01-01
            • 2020-10-04
            • 1970-01-01
            • 2011-04-09
            相关资源
            最近更新 更多