|
Фоновые процедуры, или способ обойтись без потоков
Здесь мы рассмотрим возможность для
организации фоновых действий (job)
внутри однопоточной программы с сохранением реакции
этого потока на события от мыши и клавиатуры.
Еще не столь давно программисты пытались
эмулировать потоки, запуская процедуры внутри цикла
обработки сообщений Windows. Цикл обработки сообщений
(или цикл ожидания) — это особый фрагмент кода в программе,
управляемой событиями. Он исполняется тогда, когда программа
находит в очереди события, которые нужно обработать;
если таковых нет, программа может выполнить в это время
"фоновую процедуру". Такой способ имитации
потоков весьма сложен, т. к. вынуждает программиста,
во-первых, сохранять состояние фоновой процедуры между
ее вызовами, а во-вторых, определять момент, когда она
вернет управление обработчику событий. Если такая процедура
выполняется долго, то у пользователя может сложиться
впечатление, что приложение перестало реагировать на
внешние события. Использование потоков снимает проблему
переключения контекста, теперь контекст (стек и регистры)
сохраняет операционная система.
В Delphi возможность создать фоновую
процедуру реализована через событие
Onldle .объекта Application!
type TIdleEvent =
procedure (Sender: TObject;
var Done: Boolean)
of object;
property Onldle:
TIdleEvent;
Обработчик этого события вы можете
написать, поместив на форму компонент
TApplicationEvents со страницы Additional
Палитры компонентов.
Чтобы сделать в фоновом режиме какую-то
работу, следует разбить ее на кванты и выполнять по
одному кванту каждый вызов Onldle
— иначе приложение будет плохо реагировать на внешние
воздействия.
|