Программа зависает на MessageBox () - PullRequest
0 голосов
/ 07 июня 2011

Вот проблема: основной поток GUI выполняет SendMessage в другой поток GUI (да, есть несколько потоков GUI, и, к сожалению, это не может измениться).Когда этот второй поток GUI получает SendMessage, он может решить отобразить окно сообщения.Иногда MessageBox «замораживает» все приложение.

В частности, отображается окно сообщения, но весь графический интерфейс пользователя зависает (пользовательский ввод нигде не работает).

С помощью отладчика я проверил, что второй поток GUI вращается в функции DialogBox2 (), определенной в user32.dll.В разборке я вижу, что выполняется насос сообщений (я вижу, что вызывается IsDialogMessage / TranslateMessage / DispatchMessage).Используя spy ++, я не вижу сообщений, обрабатываемых для диалогового окна сообщения.Я вижу, что сообщения обрабатываются в главном окне графического интерфейса пользователя (например, WM_SETCURSOR, хотя я не думаю, что они обрабатываются, поскольку я считаю, что SendMessage не выполняет обработчик сообщений).

Второй поток выполняет кодэто часть DLL расширения MFC, если это имеет значение.

Я пытался использовать AfxMessageBox () / CWnd :: MessageBox / :: MessageBox (родительское окно NULL, ...).У всех одна и та же проблема.

Кто-нибудь видел что-нибудь подобное раньше?

Спасибо, Андрей

1 Ответ

1 голос
/ 07 июня 2011

Должно быть, проблема связана с блокировкой одного из потоков GUI.

Попробуйте:

Замените :: SendMesage на :: PostMessage, за которым следует цикл :: MsgWaitForMultipleObjects.Вам нужно будет передать дескриптор события, который сигнализирует о закрытии окна сообщения.

Вероятно, это решит проблему.

Просто будьте внимательны, какие сообщения вы отправляете в цикле :: MsgWaitForMultipleObjects.

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