请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

吾爱极客

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 882|回复: 0

使用并行编程库中的TTask

[复制链接]

271

主题

271

帖子

1129

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1129
发表于 2015-11-4 00:14:37 | 显示全部楼层 |阅读模式

并行编程库(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翻译整理,转载请注明出处



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|吾爱极客 ( 粤ICP备15067754号-1  

GMT+8, 2018-7-19 14:00 , Processed in 0.196291 second(s), 33 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表