Сообщения Windows обслуживаются, пока отображается диалоговое окно подтверждения? - PullRequest
1 голос
/ 21 сентября 2009

У меня есть приложение MFC, которое порождает несколько различных рабочих потоков и скомпилировано с VS2003.

При вызове CTreeCtrl :: GetItemState () я иногда получаю всплывающее диалоговое окно с утверждением отладки. Я предполагаю, что это потому, что я передал дескриптор недопустимому элементу, но это не моя непосредственная задача.

Меня беспокоит: из моих журналов выглядит так, как будто поток MFC продолжает обслуживать несколько сообщений Windows, пока отображается диалоговое окно подтверждения. Я думал, что диалог подтверждения является модальным, поэтому мне было интересно, возможно ли это вообще?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2009

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

В обычном модальном диалоге это не проблема, поскольку родительское окно обычно отключается на время диалога.

Код, который запускает диалоговое окно подтверждения, должен был не определить родительское окно, и поэтому он не был отключен. Это может произойти, если ваше главное окно не является активным окном на момент подтверждения. Другие вещи могут пойти не так, как надо.

Вы можете изменить способ отображения средой выполнения Visual Studio C ошибок подтверждения с помощью _CrtSetReportMode . Вы можете остановить его в отладчике и / или войти в окно вывода вместо того, чтобы пытаться показать диалоговое окно.

2 голосов
/ 21 сентября 2009

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

Если вам нужно остановить все, когда срабатывает assert, обычно не так уж сложно написать собственную реализацию assert() (или ASSERT() или что-то еще), которая ворвется в отладчик вместо отображения окна сообщения, которое спрашивает вас хотите взломать отладчик (возможно, только если он определит, что отладчик подключен).

...