Весь код GUI должен запускаться из основного потока, и похоже, что вы следуете этому правилу.
Если вы позвоните Sleep
, то вызывающий поток не выполнит код, пока не истечет время ожидания. Если вы наберете Sleep
из основного потока, очередь сообщений не будет перекачена, пока не истечет время ожидания. Следовательно, все приложение выглядит замороженным.
Почему вызов Sleep
из одной формы влияет на другую форму? Потому что все компоненты GUI обслуживаются из единой очереди сообщений основного потока. После того, как вы перестанете качать эту очередь, все компоненты GUI прекратят получать сообщения в очереди, такие как WM_PAINT
, WM_KEYDOWN
и т. Д.
Насколько я понимаю, ваша проблема в том, что ваше приложение выглядит зависшим при загрузке текстового файла размером 3 МБ в элемент управления для редактирования. Этот размер файла не кажется мне слишком большим, и одним из очевидных решений было бы найти элемент управления для редактирования, который лучше выполняет загрузку. Например, я уверен, что Notepad, Notepad ++ и т. Д. Не выполняют никаких шагов, например, показывают прогресс при загрузке таких файлов. Я скорее подозреваю, что эти приложения не качают очередь при загрузке файлов, но вы просто не замечаете это из-за короткого времени.
Чего вы не хотите, так это того, чтобы вы качали свою очередь, чтобы ваш GUI реагировал и, в свою очередь, позволял пользователю начать загрузку другого файла, пока первый еще загружается. Вам нужно отключить ваш пользовательский интерфейс во время обработки операции загрузки. Модальный диалог прогресса - один из способов сделать это.
Если вы не можете переключиться на более эффективный элемент управления, вы можете показать модальное диалоговое окно прогресса и использовать фоновый поток, подобный этому. Фоновый поток будет загружать файл небольшими порциями, скажем, в список строк. После того, как каждый кусок файла будет готов, он вызовет Synchronize и получит основной поток для добавления содержимого списка строк в элемент управления редактирования, а затем очистит список строк. Затем поток продолжит работу и загрузит следующий фрагмент. Добавление элемента управления для редактирования небольшими порциями позволит вам обслуживать очередь сообщений.
Вы могли бы показать прогресс в строке состояния, а не в модальном диалоге, который был бы менее навязчивым. Но не забудьте отключить любой пользовательский интерфейс, который может вызвать повторное поступление.