Почему ProcessMessages мог бы бросить Исключение C++?

При поддержании старого продукта я столкнулся с ошибкой, которая приводит к экрану, являющемуся заполненным сотнями окон сообщения, говоря 'Исключение C++' и ничто иное. Я проследил проблему до следующей строки:

Application->ProcessMessages();

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

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

Закрытие всех окон сообщения заставляет приложение возвращаться к нормальному, ожидаемому поведению.

Обновление - еще После некоторого поиска, я нашел, что ошибки являются не обязательно отказом ProcessMessages. Ошибки происходят, потому что программа делает некоторые интенсивные вычисления и на самом деле исчерпывает память. Кажется, что комментирование ProcessMessages уменьшает потребление памяти как раз для прохода через вычисления без ошибок. Следовательно, ProcessMessages похож на преступника, но на самом деле, не.

Похоже, что у меня есть некоторый рефакторинг, чтобы сделать.

Обновление 2 - Три дня спустя, я пришел к выводу, что ошибка только происходит, когда ProcessMessages называют. Если я комментирую все вызовы к ProcessMessages (и к моей тревоге, существуют многие), то выполнение приложения, прекрасное с постоянным потреблением памяти, подразумевая, что интенсивные вычисления не являются неопытными память. Некомментарий вызова заставляет память взлетать на грани ошибки снова. Таким образом, исходный вопрос стоит: почему ProcessMessages вызывает эту ошибку?

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

1
задан Johan 10 June 2014 в 13:32
поделиться

2 ответа

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

Звучит правдоподобно?

0
ответ дан 2 September 2019 в 22:44
поделиться

Это определенно звучит как ошибка приложения в коде обработки сообщений библиотеки с универсальным обработчиком исключений, который показывает типовое сообщение с использованием API Win32 :: MessageBox () в ответ. Найдите в коде строку «Исключение C ++» и посмотрите, есть ли она в catch (...) , catch (std :: exception &) или подобном обработчике. Возможно, вместо этого они используют фильтр необработанных исключений Win32 .

Желательно запускать программу под отладчиком Visual Studio с диалоговым окном «Отладка-> Исключения», настроенным для перехвата исключений C ++ при их возникновении, а не в случае их необработанного. Таким образом вы обнаружите, что сайт (ы) немедленно генерирует исключение.

Если вы не можете работать под отладчиком, возможно, вам придется настроить обработчик необработанных исключений с помощью макросов C __ LINE __ и __ FILE __ , чтобы вы могли хотя бы узнать, какой метод генерирует ошибку. Переключитесь с отображения окна сообщения на Win32 OutputDebugString () API и используйте такой инструмент, как DebugView , для просмотра строк отладки.

2
ответ дан 2 September 2019 в 22:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: