使用XE7并行库中的TTASK.IFUTURE(转)

http://blog.csdn.net/henreash/article/details/41349145

上篇文章讲了使用TTask快速开发同时运行多个任务的应用程序,减少瓶颈。接下来讲解ITask的子接口IFuture。

IFuture

IFuture给TTask提供了一个机制,让我们可以传递返回特定类型的函数(使用了泛型,类型由<T>决定)。使用IFuture实例,运行一个任务,同时让主线程继续执行到我们需要任务运行结果处。使用这种机制可以把代码块按优先级执行,同时也保证在需要的时候获取到任务的运行结果。

范例

要在Future中获取一个值,首先定义这个值得类型,运行任务,并获取值。为了展示这个过程,下面编写一个无实际意义的范例(但演示了如何使用这个特性),后面会一步一步解释。

var

OneValue: IFuture <Integer>;

OtherValue: Integer;

Total: Integer;

begin

OneValue := TTask.Future<Integer>(function: Integer

begin

Result := ComputeSomething;

Sleep(1000); // delay to show status

end);

Memo1.Lines.Add(TRttiEnumerationType.

GetName<TTaskStatus>(OneValue.Status));

OtherValue := ComputeSomething;

Memo1.Lines.Add(TRttiEnumerationType.

GetName<TTaskStatus>(OneValue.Status));

Total := OtherValue + OneValue.Value;

Memo1.Lines.Add(TRttiEnumerationType.

GetName<TTaskStatus>(OneValue.Status));

// result

Memo1.Lines.Add(Total.ToString);

end;

代码输出如下图所示:

代码关键点

首先,使用TTask.Future<T>定义返回值的类型,接着传递一个匿名方法,返回实际的值。(这里从ComputeSomething方法返回一个整数)

将TTask.Future返回的IFuture类型实例赋给OneValue变量。

OneValue := TTask.Future<Integer>(function: Integer

begin

Result := ComputeSomething;

Sleep(1000); // delay to show status

end);

匿名方法中的Sleep操作没有什么实际意义,但可以使程序运行后,得到OneValue.Status的不同值:WaitingToRun,Running,Completed。

下面的代码,查询OneValue当前状态。下面的代码将枚举类型的状态转换为字符串类型:

TRttiEnumerationType.GetName<TTaskStatus>(OneValue.Status)

由于任务正准备执行,第一个返回值是WaitingToRun。首次状态查询后,调用ComputeSomethis任务:

OtherValue := ComputeSomething;

接着查看OneValue的状态,已经变为了运行中(由于Sleep的时间比ComputeSomething执行时间长)。

注意!是否意味着需要不停的检查状态来确定是否已经可以获取结果值了呢?当然不是。

Total := OtherValue + OneValue.Value;

这行代码告诉OneValue我们需要他的值。如果任务执行完毕则将值返回,否则将阻塞等待IFuture完成。这让开发人员很轻松。

这个IFuture可以运行你设置的过程,并在完成后返回。是另外一种节省时间提高效率的方式。

时间: 2024-10-10 23:03:54

使用XE7并行库中的TTASK.IFUTURE(转)的相关文章

使用XE7并行库中的TTask(转)

http://blog.csdn.net/henreash/article/details/41347843 上篇文章学习使用System.Threading单元提供的并行编程和TParallel.For提升循环的执行效率.当需要运行多任务而不是一个循环时,也可以使用并行方式.  使用System.Threading.TTask和System.Threading.ITask可方便的串行执行几个进程.使用TTask类创建任务,使用ITask接口实例管理进程的交互.在代码完成处理前可以使用WaitF

C#当中的多线程_任务并行库(中)

发现自己有点懒了!也可能是越往后越难了,看书理解起来有点费劲,所以这两天就每天更新一点学习笔记吧. 4.5 将APM模式转化为任务 书上提供的三种方式 方式一: 1 class Program 2         { 3                 //定义一个委托 4                 private delegate string AsynchronousTask(string threadName); 5 6                 static void Mai

Delphi XE7中新并行库

Delphi XE7中增加了新的并行库,和.NET的Task和Parellel相似度99%. 具体内容可以看下面的文章: http://www.delphifeeds.com/go/s/119574 如果你熟悉.NET,这个功能并没有大的新意,可对Delphi程序员来说却非常实用.之前要实现多线程,唯一的办法是使用TThread类,而且过程十分繁琐.新的并行库彻底简化了这个过程. 估计下一步就该实现Async和Await异步执行结构了 另外最近Delphi的排名竟然有所上升并且进了前十,对还在用

DELPHI XE7 新的并行库

DELPHI XE7 的新功能列表里面增加了并行库System.Threading, System.SyncObjs. 为什么要增加新的并行库? 还是为了跨平台.以前要并行编程只能从TThread类继承进行多线程处理,大家知道TThread类是从WINDOWS的线程API封装起来的,它封装的是WINDOWS的多线程的东西,是不能脱离WINDOWS的,当然是不能跨平台的.DELPHI现在走的是原生跨平台的道路,一切DELPHI的基础类库都要从只支持WINDOWS改为支持多平台,这是一个庞大而缓慢的

Delphi xe7并行编程快速入门(转)

http://blog.csdn.net/henreash/article/details/41315183 现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ Builder和RAD Studio XE7中,有一个简化并行运行任务的库,叫做并行编程库. 并行编程库在System.Threading单元中,其中提供了很多有用的特性,可方便的应用在已有

[转载]:Delphi xe7并行编程快速入门

现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ Builder和RAD Studio XE7中,有一个简化并行运行任务的库,叫做并行编程库. 并行编程库在System.Threading单元中,其中提供了很多有用的特性,可方便的应用在已有项目和新项目中.提供了大量便利的重载函数,可同时支持C++和Object Pascal. 这些特性包括易用的针

Delphi并行库System.Threading 之ITask 1

不知什么时候,也许是XE8,也许是XE8之前 .Delphi里面多了个System.Threading的并行库. 虽然己经有非常棒的第三方并行库QWorker,但我还是更喜欢官方的东西. 下面是一段使用System.Threading中ITask的代码 procedure TForm3.SpeedButton1Click(Sender: TObject); var tasks: array of ITask; value: Integer; LTask:ITask; X,Y:INTEGER; b

Delphi xe7并行编程快速入门(三篇)

现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ Builder和RAD Studio XE7中,有一个简化并行运行任务的库,叫做并行编程库. 并行编程库在System.Threading单元中,其中提供了很多有用的特性,可方便的应用在已有项目和新项目中.提供了大量便利的重载函数,可同时支持C++和Object Pascal. 这些特性包括易用的针

结构体在固件库中的应用

上次介绍了一般结构体的定义以及引用方法,那么接下来将对结构体在官方固件库是如何具体使用的做出简单说明. 结构体指针成员变量引用方法是通过“→”符号来实现,比如要访问student1结构体指针指向的结构体的成员变量name,那么方法是: stuednt1—>name; 如在STM32官方固件库中对端口使用模式结构体定义如下: typedef enum { GPIO_Mode_AIN = 0x0, //模拟输入模式 GPIO_Mode_IN_FLOATING = 0x04, //浮空输入模式 GPI