Проблема обработчика исключений в C ++ - PullRequest
2 голосов
/ 19 февраля 2010

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

SetUnhandledExceptionFilter();

для перехвата любых необработанных исключений, и это работает очень хорошо.

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

Если я разрешу Windows обработать сбой, Windows отобразит диалоговое окно, которое работает, но останавливает сообщения, распространяющиеся на остальную часть приложения, и, следовательно,WM_TIMER не переиздается.

Кто-нибудь знает, как мне добиться того же эффекта?

Спасибо, Рич

Ответы [ 2 ]

2 голосов
/ 19 февраля 2010

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

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

0 голосов
/ 19 февраля 2010

Показать диалог во второй теме.У меня была более или менее та же проблема (но я должен был показать окно сообщения, а не диалоговое окно).

  • Напишите класс, в котором вы создаете два события, используя функцию Win32 CreateEvent.Одно событие (триггер) используется для запуска диалога, одно событие (готово) - сигнализировать, что диалог был обработан.
  • Добавить метод 'execute' в класс и запустить этот метод во втором потоке
  • Пусть метод execute выполняет ожидание, пока не будет установлено событие триггера, и, если он установлен, отобразит диалоговое окно
  • После того, как диалог был обработан, установите событие ready.
  • Если ваше приложение дает сбой в главном потоке, подготовьте некоторую информацию для диалога (через установщики в классе) и установите событие 'trigger', затем дождитесь события 'ready'.Установка события триггера активирует второй поток, и основной поток будет блокироваться, пока второй поток не установит событие готовности
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...