Использование PeekMessage и PostMessage - PullRequest
0 голосов
/ 09 мая 2018

У меня есть устаревшее приложение, которое я поддерживаю, которое вызывает 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_variable и std::mutex. Интересно, были ли эти PostMessage и PeekMessage так или иначе связаны с этими событиями? Приложение также имело несколько PumpMessage (в которых была приведена выше реализация) и StopMessagePump реализаций, которые я никогда не использовал и больше не нахожу полезными. Предполагается, что приложение запускается в фоновом режиме, то есть оно не владеет и не обрабатывает никаких окон консоли самостоятельно.

Я прочитал документацию по MSDN , и мне трудно понять, как они ссылаются на PostThreadMessage как особый случай.

Однако, в общем, на что способен PostMessage(NULL,WM_CLOSE,0,0)?

1 Ответ

0 голосов
/ 09 мая 2018

Как задокументировано PostMessage с NULL ведет себя как PostThreadMessage. Но всегда для нынешней тройки. В вашей ситуации, если есть только один поток, это все равно что установить флаг. Даже многопоточности не происходит. Мьютекс или другие специальные объекты не нужны.

Если есть многопоточность, чем и если окна вообще нет, и вам не нужна синхронизация между такими окнами с PostMessage и циклом сообщений, вы можете просто использовать std::condition_variable или std::mutex.

Вместо PostMessage используйте notify_one или notify_all. Вместо цикла сообщений используйте wait_for. (Mutex соответственно)

Но имейте в виду, если у вас есть COM STA или аналогичный, вам все равно нужен цикл обработки сообщений. Вы по-прежнему можете использовать std::condition_variable или std::mutex, но вам следует останавливать цикл обработки сообщений только после того, как все объекты, которые вы когда-либо создавали, были уничтожены и ваше условие выполнено!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...