Полностью остановить приложение, когда отображается всплывающее окно «Вы потерпели крах, извините ...» - PullRequest
0 голосов
/ 17 декабря 2009

Если происходит сбой моего приложения, я перехватываю сбой (используя функцию SetUnhandledExceptionFilter). В моем обработчике сбоев я создаю мини-дамп-файл и уведомляю пользователя о сбое его приложения. Это уведомление делается через MessageBox с флагом MB_TASKMODAL, поэтому остальная часть приложения блокируется.

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

Существует ли простой способ запретить Windows отправлять сообщения перерисовки и таймера (при отображении всплывающего окна «Вы потерпели крах»)?

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

Thanx Patrick

Ответы [ 2 ]

1 голос
/ 17 декабря 2009
  • невозможно запретить Windows отправлять сообщения перерисовки и таймера. В конце концов, вы хотите, чтобы и само окно сообщения было перекрашено.

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

  • вы взяли мини-дамп и знаете, что ваше приложение не работает. Почему вы хотите сохранить процесс и показать окно сообщений изнутри? Вы, очевидно, не ожидаете, что приложение сможет восстановиться, поэтому разумным на этом этапе является запуск небольшого вспомогательного процесса, который будет показывать сообщение пользователю и завершать аварийное приложение.

0 голосов
/ 17 декабря 2009

Существует только один способ безопасного отображения диалога сбоя - в отдельном потоке, созданном специально для него. Создание диалога в аварийном потоке вызовет всевозможные побочные эффекты (как вы заметили), поскольку оно будет качать и отправлять как отправленные, так и отправленные сообщения, предназначенные для окон в этом потоке.

Вопрос в том, безопасно ли создавать диалог из обработчика сбоев? Я могу вспомнить несколько сценариев, в которых это может быть проблематично, особенно если была задействована глобальная блокировка загрузчика (т. Е. Происходит сбой где-то внутри инициализации объекта, вызванный загрузкой DLL).

Так что, вероятно, хорошая идея - создать поток при запуске приложения и оставить его в режиме ожидания.

...