Delphi: замороженная форма - PullRequest
       0

Delphi: замороженная форма

0 голосов
/ 11 августа 2011

Существует 2 формы.

Форма 2 не создается автоматически.

 Form2:=TForm2.Create(Application);
 Form2.Show;

Если сделать Sleep(10000); внутри любой формы, тогда другая будет заморожена.Как предотвратить такое поведение?

Моя проблема: большой текстовый файл (3 Мб) непрерывно назначается (Lines.Assign) в текстовый редактор, поэтому форма заморожена.

Можно ли использовать другую незамерзшую форму (не модальную) для отображения индикатора выполнения (стиль pbstMarquee)?

Ответы [ 2 ]

6 голосов
/ 11 августа 2011

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

Если вы позвоните Sleep, то вызывающий поток не выполнит код, пока не истечет время ожидания. Если вы наберете Sleep из основного потока, очередь сообщений не будет перекачена, пока не истечет время ожидания. Следовательно, все приложение выглядит замороженным.

Почему вызов Sleep из одной формы влияет на другую форму? Потому что все компоненты GUI обслуживаются из единой очереди сообщений основного потока. После того, как вы перестанете качать эту очередь, все компоненты GUI прекратят получать сообщения в очереди, такие как WM_PAINT, WM_KEYDOWN и т. Д.

Насколько я понимаю, ваша проблема в том, что ваше приложение выглядит зависшим при загрузке текстового файла размером 3 МБ в элемент управления для редактирования. Этот размер файла не кажется мне слишком большим, и одним из очевидных решений было бы найти элемент управления для редактирования, который лучше выполняет загрузку. Например, я уверен, что Notepad, Notepad ++ и т. Д. Не выполняют никаких шагов, например, показывают прогресс при загрузке таких файлов. Я скорее подозреваю, что эти приложения не качают очередь при загрузке файлов, но вы просто не замечаете это из-за короткого времени.

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

Если вы не можете переключиться на более эффективный элемент управления, вы можете показать модальное диалоговое окно прогресса и использовать фоновый поток, подобный этому. Фоновый поток будет загружать файл небольшими порциями, скажем, в список строк. После того, как каждый кусок файла будет готов, он вызовет Synchronize и получит основной поток для добавления содержимого списка строк в элемент управления редактирования, а затем очистит список строк. Затем поток продолжит работу и загрузит следующий фрагмент. Добавление элемента управления для редактирования небольшими порциями позволит вам обслуживать очередь сообщений.

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

0 голосов
/ 11 августа 2011

Лучше загрузите ваш файл в отдельном потоке.Или вам придется создать вторую форму в виде простого WinAPI, потому что VCL не поддерживает многопоточность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...