Почему мой PaintBox Canvas стирается, когда моя программа "Не отвечает"? - PullRequest
3 голосов
/ 11 августа 2010

Я написал небольшую программу с использованием Borland C ++ Builder, и все это выглядело нормально.В моей программе есть окно карты и окно таблицы, и когда пользователь нажимает кнопку, запускается длинный процесс, который считывает всю информацию о карте и таблице, а затем отображает ее.Каждый раз, когда я запускал его через отладчик, у меня не было проблем.Тогда сегодня я решил проверить это, не пропуская его через отладчик.К моему ужасу, программа считывает информацию с карты, а затем без проблем отображает ее на холсте, но когда загружает информацию для сетки, карта стирается !!!Похоже, это происходит во время фазы загрузки таблицы.это занимает около 4 секунд, и в течение этого времени окно сообщает мне, что оно не отвечает.Это когда карта стирается.У кого-нибудь есть идеи о том, почему это происходит?Это сводит меня с ума, и я не совсем понимаю, что здесь происходит под капотом.

ОБНОВЛЕНИЕ:
Я до некоторой степени исправил проблему.Я осматривался и обнаружил: Избегание метки «(не отвечает)» в окнах при обработке большого количества данных одним комком
Я добавил код для запуска один раз в середине данных, считанных вдля стола.это исправило мои проблемы.Однако мне было интересно, если кто-нибудь знает, почему это так?почему моя программа перестает отвечать на запросы, из-за чего мои холсты стираются?

Ответы [ 2 ]

4 голосов
/ 19 августа 2010

Маркус Юнглас написал подробное объяснение проблемы, которая затрагивает как Delphi, так и C ++ Builder.

При программировании обработчика событий в Delphi (например, событие OnClickTButton), наступает момент, когда ваше приложение должно быть какое-то время занятым, например, код должен записывать большой файл или сжимать некоторые данные.

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

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

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

Вы можете уменьшить проблему, вызвав Application-> ProcessMessages () во время загрузки данных карты, однако я рекомендую использовать отдельный поток для загрузкиданные.

2 голосов
/ 19 августа 2010

Я никогда не использовал C ++ Builder, но я использовал Delphi.Я думаю, что библиотеки одинаковы.

Сохраняет ли используемый вами компонент данные изображения?Это может только привлечь к экрану.Попробуйте закрыть окно вашего приложения другим окном.Если он удаляется, вы должны использовать компонент, в котором хранится изображение.

См. this , это для Delphi, но это может помочь.В C ++ Builder должен быть компонент Image.Попробуйте использовать это вместо PaintBox.

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

...