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 }