Группы задач
Еще одной интересной возможностью OTL – является возможность группировки фоновых задач. Работая с группой задач, программист может, используя интерфейс группы управлять всеми входящими в группу задачами.
Рассмотрим эту работу на примере OTL tests\15_TaskGroup. Группы задач в OTL определены через интерфейс IOmniTaskGroup.test_15_TaskGroup.pas Создание задач и постановка их в группу
type
TfrmTestTaskGroup = class(TForm)
. . .
strict private
// Интерфейс группы
FTaskGroup: IOmniTaskGroup;
. . .
end;
procedure TfrmTestTaskGroup.btnStartTasksClick(Sender: TObject);
var
i: integer;
begin
// Создание класса TOmniTaskGroup реализующего данный интерфейс
FTaskGroup := CreateTaskGroup;
for i := 1 to 10 do
CreateTask(TMyWorker.Create()).
MonitorWith(OmniTED).
Join(FTaskGroup); // ставим в группу
Log('Starting all tasks');
FTaskGroup.RunAll; //Запуск всех задач в группе на выполнение
end;
Для создания группы мы используем функцию CreateTaskGroup которая создает объект класса TOmniTaskGroup (реализующий интерфейс IOmniTaskGroup), который и предоставляет методы управления.
Постановка в группу осуществляется методом Join интерфейса ITasksControl.
function Join(const group: IOmniTaskGroup): IOmniTaskControl;
Обратная операция осуществляется методом Leave
function Leave(const group: IOmniTaskGroup): IOmniTaskControl;
После того как задача поставлена в группу, все операции c группой будут автоматически делегированы и на эту задачу. Для работы с группой предусмотрены следующие методы интерфейса IOmniTaskGroup.
IOmniTaskGroup
IOmniTaskGroup = interface ['{B36C08B4-0F71-422C-8613-63C4D04676B7}']
function Add(const taskControl: IOmniTaskControl): IOmniTaskGroup;
function GetEnumerator: IOmniTaskControlListEnumerator;
function RegisterAllCommWith(const task: IOmniTask): IOmniTaskGroup;
function Remove(const taskControl: IOmniTaskControl): IOmniTaskGroup;
function RunAll: IOmniTaskGroup;
procedure SendToAll(const msg: TOmniMessage);
function TerminateAll(maxWait_ms: cardinal = INFINITE): boolean;
function UnregisterAllCommFrom(const task: IOmniTask): IOmniTaskGroup;
function WaitForAll(maxWait_ms: cardinal = INFINITE): boolean;
end; { IOmniTaskGroup }
Рассмотрим основные из них подробнее: методы Add и Remove – соответственно добавляют интерфейс управления фоновой задаче (созданной ранее) к группе и убирают ее из нее. Метод RunAll – запускает все задачи в группе на выполнение, соответственно TerminateAll – завершает их. Метод SendToAll позволяет отправить всем фоновым задачам сообщение.
Как видите ничего сложного при работе с группами задач нет.
Комментариев нет:
Отправить комментарий