PeekMessage和PostMessage使用情况

时间:2018-05-09 05:15:24

标签: c++ windows winapi

我有一个我维护的遗留应用程序,在某些地方调用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_variablestd::mutex代替。我想知道这些PostMessagePeekMessage是否与这些事件有关。该应用程序还有一些PumpMessage(具有上面引用的实现)和StopMessagePump实现,我从未使用过,并且不再有用。应用程序应该在后台运行,即它本身不拥有或处理任何控制台窗口。

我阅读了MSDN上的文档,我觉得很难理解,因为他们在内部将PostThreadMessage称为特殊情况。

但是,一般情况下,PostMessage(NULL,WM_CLOSE,0,0)能够做什么?

1 个答案:

答案 0 :(得分:1)

记录为PostMessage的NULL表现得像PostThreadMessage。但总是为现在的三人。在你的情况下,如果只有一个线程,就像设置一个标志。甚至没有多线程发生。不需要互斥锁或其他特殊对象。

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

而不是PostMessage使用notify_onenotify_all。而不是消息循环使用wait_for。 (因此互斥)

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