首页 > 代码库 > 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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。