首页 > 解决方案 > PeekMessage 和 PostMessage 用法

问题描述

我有一个正在维护的遗留应用程序,它PostMessage(NULL,WM_CLOSE,0,0);在某些地方调用。通过查看代码我无法猜测它是否连接到以下(在不同的线程中执行),

MSG msg;
while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))  {
    if ( msg.message == WM_CLOSE)
    {
        return;
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg); 
}

早些时候,它使用一些 win32 事件来同步线程之间的访问。但是,现在我已经修改它以使用std::condition_variableandstd::mutex代替。我想知道这些是否PostMessagePeekMessage这些事件有关。该应用程序还有一些PumpMessage(上面引用的实现)和StopMessagePump我从未使用过且不再有用的实现。该应用程序应该在后台运行,即它本身不拥有或处理任何控制台窗口。

我阅读了MSDN上的文档,发现很难理解,因为它们在内部将 PostThreadMessage 称为特例。

但是,总的来说,有什么PostMessage(NULL,WM_CLOSE,0,0)能力?

标签: c++windowswinapi

解决方案


正如记录的那样,带有 NULL 的PostMessagePostThreadMessage的行为类似于. 但总是针对当前的三个广告。在您的情况下,如果只有一个线程,就像设置一个标志一样。甚至没有发生多线程。不需要互斥体或其他特殊对象。

如果存在多线程,并且根本没有窗口,并且您不需要在此类窗口之间使用 aPostMessage和消息循环进行任何同步,则可以使用std::condition_variableor std::mutex

而不是PostMessage使用notify_oneor notify_all。而不是消息循环使用wait_for. (相应的互斥锁)

但请注意,如果您有 COM STA 或类似设备,您仍然需要消息循环。您仍然可以使用std::condition_variableor std::mutex,但您应该只在您创建的所有对象都被销毁并且满足您的条件后才停止消息循环!


推荐阅读