среда, 29 сентября 2010 г.

Использование OmniThread Libray (OTL) для создания многопоточных приложений - 9

Группы задач

Еще одной интересной возможностью 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 позволяет отправить всем фоновым задачам сообщение.
Как видите ничего сложного при работе с группами задач нет.

Комментариев нет:

Отправить комментарий