首页 > 代码库 > Omnithreadlibary学习(1)-异步执行

Omnithreadlibary学习(1)-异步执行

program main;{$APPTYPE CONSOLE}{$R *.res}uses  System.SysUtils,  OtlParallel;begin  Parallel.Async(procedure  var    i: Integer;  begin  for I := 0 to 100 do     Writeln(Format(‘No.%d‘, [i]));  end);  Writeln(‘执行一‘);  Sleep(100);  Writeln(‘执行二‘);  Sleep(100);  Writeln(‘执行三‘);  Sleep(100);  Readln;end.

 输出结果:

 

 程序非常简单

 引用OtlParallel.pas单元 创建一个匿名函数控制台输出1..10 

 跟进源码看到下面两个函数

procedure Parallel.Async(task: TProc; taskConfig: IOmniTaskConfig);TOmniTaskDelegate = reference to procedure(const task: IOmniTask);//TOmniTaskDelegate 任务委托声明
procedure Parallel.Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig);

第一个函数Async 接受一个TProc的匿名函数, taskConfig默认为nil (IOmniTaskConfig应该是设置任务的一些属性后面在研究)

实际内部调用用了Parallel.Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig) 

方便使用

class procedure Parallel.Async(task: TProc; taskConfig: IOmniTaskConfig);begin  Async(    procedure (const omniTask: IOmniTask)    begin      task;    end,    taskConfig  );end; { Parallel.Async }class procedure Parallel.Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig);var  omniTask  : IOmniTaskControl;  terminated: TOmniTaskConfigTerminated;begin  if assigned(taskConfig) then    (taskConfig as IOmniTaskConfigInternal).DetachTerminated(terminated);  omniTask := CreateTask(task, Parallel.Async).Unobserved.OnTerminated(    procedure (const task: IOmniTaskControl)    var      exc: Exception;    begin      terminated.Call(task);      exc := task.DetachException;      if assigned(exc) then        raise exc;    end  );  Parallel.ApplyConfig(taskConfig, omniTask);  omniTask.Unobserved;  omniTask.Schedule(GetPool(taskConfig));end; { Parallel.Async }