Ни одна из ваших связанных статей не касается вашей проблемы. То, что вы видите, - это поведение программы, которая не обрабатывает сообщения Windows, поэтому она не будет перерисовывать части, которые становятся недействительными, и не будет реагировать на ввод с клавиатуры или мыши (например, перемещение или изменение размера с помощью мыши, или активация приложения). с помощью кнопки панели задач).
В вашем коде вы называете StatusBar1.Update
, поэтому, по крайней мере, текст строки состояния перерисовывается, но помимо выхода на первый план ваше приложение, вероятно, также игнорирует запросы на перемещение или изменение размера.
Вам необходимо своевременно обрабатывать сообщения Windows, поэтому любой путь выполнения, который занимает более 200 или 300 миллисекунд, должен обеспечивать обработку сообщений, в противном случае приложение будет зависать или зависать.
У вас есть три основных варианта:
Сохраните долго работающий код и вставьте вызовы на Application.ProcessMessages
- это позволит обрабатывать сообщения Windows. Убедитесь, что вы не допустите повторного ввода кода, например, отключив все элементы управления, которые используются для запуска операции.
Переработайте ваш код так, чтобы он отображался в виде последовательности шагов, каждый из которых занимает не более 10 миллисекунд. Поместите вызовы кода в обработчик событий таймера или вызовите его из обработчика Application.OnIdle
.
Вызовите свой код в рабочем потоке и опубликуйте сообщения в основном потоке графического интерфейса для обновления вашего пользовательского интерфейса.
У всех этих опций есть свои плюсы и минусы, и для многопоточности, особенно здесь, на SO есть много вопросов и ответов. Это самый сложный, но лучший вариант, когда вы работаете над чем-то большим, чем просто игрушечная программа.