Моя рекомендация относительно TApplication.ProcessMessages
состоит в том, чтобы никогда не использовать его - просто нет смысла размещать его.
Представьте себе, что делает вызов: ваше приложение запускает цикл сообщений - где сообщения Windows (создаваемые ОС, другими приложениями, вашим приложением и т. Д.) Последовательно обрабатываются - и там, в середине одного из сообщений-процессы, вы просто заново запускаете весь цикл сообщений, не имея контроля над тем, какие сообщения будут обрабатываться, сколько их будет, если какое-либо из сообщений войдет в свой собственный цикл сообщений ... и если ониесть проблемы с повторным входом или нет.Это то, что я называю приглашением неприятностей .
Иногда существуют веские причины для обработки некоторых сообщений Windows (особенно для того, чтобы не вешать другие потоки) или для обработки всех сообщений, направленных в конкретное окно, но это может быть выполнено более тонкопути, с большим контролем.
Если вам необходимо выполнить какую-либо обработку в главном потоке графического интерфейса и вы просто хотите обновить интерфейс, вы можете использовать метод TWinControl.Repaint
для перерисовки элементов графического интерфейса.Если вы хотите, чтобы приложение реагировало на пользовательский ввод, вам, в основном, нужно использовать потоки backgroud / worker.
Примечание: в Delphi при любой длительной обработке в основном потоке, особенно, если требуется ожидание, выпредполагается периодически вызывать CheckSynchronize
, чтобы позволить другим потокам синхронизироваться с основным потоком - они могут (и, вероятно, будут) зависать в противном случае.VCL вызывает это только тогда, когда приложение бездействует и обрабатывает сообщение WM_NULL
(которое ничего не делает, что также может вызвать некоторые интересные побочные эффекты).