Дождаться события с другого потока, не прерывая обработку сообщений?

Многопоточность для меня неизведанная тема, подскажите, как правильно сделать.


Собственно, есть неосновной поток, который исполняет некую полезную работу и может оповестить (как ?) главный поток о каком-то событии.

Как сделать так, чтобы обработка сообщений оконной процедуры не прекращалась, ожидая это событие? (Т.е. цель в том, чтобы главное окошко не «подвисло», не отвечая на запросы пользователя).

Нужно использовать PostMessage? А есть возможность не затрагивать оконную процедуру (т.е. не отсылать сообщения), что-то на подобии WaitForSingleObject?
  • Вопрос задан
  • 3552 просмотра
Пригласить эксперта
Ответы на вопрос 3
@vScherba
MsgWaitForMultipleObjects[Ex]
Если используете ATL в проекте, то можно заюзать AtlWaitWithMessageLoop. А если не используете, то посмотрите ее исходник в качестве примера юзания MsgWaitForMultipleObjects.
Ответ написан
Akson87
@Akson87
Можно еще в основном потоке по таймеру проверять как там дополнительный поток живет. Хотя Пост/СендМессадж правильнее.
Ответ написан
Комментировать
AxisPod
@AxisPod
Можно вообще просто поступить, если есть гарантии, что пишет только 1 поток. Объявить volatile переменную, засунуть туда к примеру false и запустить поток, затем по окончании записать true, да в основном рабочем потоке проверять её изменение. Если гарантии нет, что писать будет 1 поток, можно взять к примеру std::atomic, если старый компилятор, то стырить где-нить реализацию. Опять же можно просто использовать InterlockedIncrement и семейство функций.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы