并行编程库(PPL)提供了一个TTask类来运行一个任务或并行运行多个任务。 一个Task就是你想完成的一个工作单元。 PPL把任务与完成任务的线程结合起来,这样你可以并行地运行几个任务,而又不需要创建和管理你自己的线程。
TTask创建和管理多个交互的ITask实例。ITask是一个接口, 提供了一系列的方法和属性来启动,等待,取消一个线程,还有状态属性(Created,WaitingToRun, Running, Completed, WaitingForChildren, Canceled, Exception)。
Ttask 提供了 WaitForAll 和 WaitForAny 来等待所有或任意任务完成。WaitForAll 当所有任务都完成时返回,然而 WaitForAny 告知你第一个完成的任务。 比如,你有两个任务A和B分别需要3和5秒钟,获取结果的时间是:
>顺序执行(不用TTask/ITask)=8秒。 >TTask.WaitForAny = 3 秒。 >TTask.WaitForAll = 5 秒。
接下来这个例子使用 WaitForAll 方法:
Delphi:
procedure TFormThreading.MyButtonClick(Sender: TObject); var tasks: array of ITask; value: Integer; begin Setlength (tasks ,2); value := 0;
tasks[0] := TTask.Create (procedure () begin sleep (3000); // 3 seconds TInterlocked.Add (value, 3000); end);
tasks[0].Start;
tasks[1] := TTask.Create (procedure () begin sleep (5000); // 5 seconds TInterlocked.Add (value, 5000); end);
tasks[1].Start;
TTask.WaitForAll(tasks); ShowMessage ('All done: ' + value.ToString); end;
C++: void __fastcall TFormThreading::MyButtonClick(TObject *Sender) { _di_ITask tasks[2];
tasks[0] = TTask::Create(_di_TProc(new TCppTask(lvalue,3000, Label1))); tasks[0]->Start());
tasks[1] = TTask::Create(_di_TProc(new TCppTask(lvalue,5000, Label1))); tasks[1]->Start());
TTask::WaitForAll(tasks,(sizeof(tasks)/sizeof(tasks[0])-1)); ShowMessage("All done! "+IntToStr(lvalue)); }
TTask的另一个功能是在后台启动一些东西的时候防止用户界面卡死。 下面的代码例子告诉你怎样运行一个单任务,让它过一小段时间后才启动:
Delphi: procedure TFormThreading.Button1Click(Sender: TObject); var aTask: ITask; begin aTask := TTask.Create (procedure () begin sleep (3000); // 3 seconds ShowMessage ('Hello'); end); aTask.Start; end;
C++: void __fastcall TFormThreading::Button1Click(TObject *Sender) { Label1->Caption = "--"; lvalue = 0; _di_ITask aTask = TTask::Create(_di_TProc(new TCppTask(lvalue,3000,Label1))); aTask-> Start(); Label1->Caption =InToStr(lvalue); }
www.52jike.com (吾爱极客) ruanzhuo翻译整理,转载请注明出处
|