MsgWaitForMultipleObjectsEx блокирует основной поток STA в приложении MFC - PullRequest
1 голос
/ 24 июня 2011

Что лучше было сделать для синхронизации потоков STA?

У меня есть диалоговое приложение MFC с двумя потоками STA: основным и вторым. Я создал объект COM в основном потоке пользовательского интерфейса.

Я вызываю интерфейс COM из второго потока. В главном потоке, чтобы убедиться, что второй поток завершается до того, как основной поток продолжается, я использую цикл для ожидания потока. Этот цикл вызывает циклический вызов MsgWaitForMultipleObjectsEx (timout = 500).

Я сразу зашла в тупик в ожидании. Затем я понял, что насос сообщений MFC, AfxInternalPumpMessage (), помогает только блокировать вызовы, но совсем не помогает в ситуациях тупика.

Затем я добавил Peek / Translate / DispatchMessage код в цикл ожидания, и тогда все заработало.

Теперь, похоже, что без ручного кодирования цикла Peek / Translate / DispatchMessage вы вообще не сможете синхронизировать потоки STA? Любой ожидающий вызов заблокирует вас. Тогда какой самый лучший или стандартный способ синхронизации потоков STA?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Возможно, вы ищете CoWaitForMultipleHandles?

Если абонент находится в одной нити CoWaitForMultipleHandles входит в модальный цикл COM, а поток Цикл сообщений будет продолжать отправлять сообщения с использованием сообщения темы фильтр. Если фильтр сообщений не зарегистрирован для потока, COM по умолчанию используется обработка сообщений.

0 голосов
/ 27 июня 2011

Не любое ожидание, но любое ожидание, которое прекращает выполнение цикла сообщений, действительно заблокирует вас. Решение состоит в том, чтобы чередовать цикл ожидания и обработку цикла сообщений - немного подождать, затем обработать все ожидающие сообщения, повторить.

...