Delphi D10.X 并行库PPL编程之TTask

类是Delphi中的多线程编程工具,它允许您在应用程序中创建并发任务,以便同时执行多个操作。TTask类是System.Threading单元中的一部分,它提供了一组方法和属性,可用于管理并发任务。

TTask类的主要特点是它允许您创建异步任务,这些任务可以在后台线程中执行,而不会阻塞主线程。这意味着您的应用程序可以同时执行多个任务,而不会影响应用程序的响应性能。

TTask类的主要方法和属性包括:

1.构造函数:TTask类的构造函数接受一个匿名方法作为参数,该方法将在后台线程中执行。

2.Start方法:Start方法启动异步任务。

3.Wait方法:Wait方法阻塞当前线程,直到任务完成。

4.Result属性:Result属性返回任务的结果。

5.Status属性:Status属性返回任务的状态,包括运行中、已完成、已取消等。

6.CancellationToken属性:CancellationToken属性允许您取消任务。

7.ContinueWith方法:ContinueWith方法允许您在任务完成后执行其他操作,例如更新UI。

使用TTask类编写多线程代码时,需要注意以下几点:

1.避免在UI线程中执行长时间运行的操作,这会导致UI线程阻塞。

2.使用CancellationToken属性取消任务,以便在任务不再需要时及时释放资源。

3.使用ContinueWith方法在任务完成后更新UI,以便及时反映任务的结果。

总之,TTask类是Delphi中强大的多线程编程工具,它允许您创建并发任务,以便同时执行多个操作,从而提高应用程序的性能和响应性。

delphi中的RTL(运行库)提供了并行编程库(PPL --Parallel Programming Library) ,让您的应用程序可以在跨平台应用中有效的使用多个CPU并行运行任务的能力。

使用TTask和ITask 并行运行多个任务

TASK说明
TTask的实例是一个可以在并行于其他正在运行的任务的线程中完成单个任务或工作内容。

TTask类创建和管理由ITask接口生成的任务实例,可以是TTask的实例,其继承类或与ITask接口兼容的其他类型。

与任务相关联的过程可以与其他相似任务或当前正在运行的其他线程相关联的过程并行运行。哪些任务将并行运行以及何时运行,由目标平台运行时环境可用的线程资源来确定。

可以使用Create构造函数创建适合并行执行的任务。使用构造函数创建后的任务过程在调用Start方法之后被视为可以执行。

ITask的WaitForAll,WaitForAny和Wait方法用于显式中止调用线程的执行,以等待任何或所有正在运行的任务。

要取消执行任何任务,请调用ITask相关实例的Cancel方法。

可以直接使用Run方法创建和管理任务过程以执行,类似于调用Create并随后立即调用Start。

对于在程序中的某个较晚一点需要返回值的任务,可以使用通用函数Future来启动任务,以确定与其他任务并行的所需值; 然后在之后需要时通过调用GetValue方法来获取计算值。

并行执行的任务可能需要使用全局的可用资源、变量等,请使用System.SyncObjs单元的同步工具来避免可能的争用问题。

使用演示
接下来演示应用程序如何使用并行编程库(PPL)实现任务 。有一个主线程管理任务队列,并从线程池中分配线程来完成任务。该线程池具有多少线程数,取决于设备可用CPU数量。

演示中使用到的控件

具体可下载DEMO查看。

实现两种执行过程
首先,我们需要引用PPL库:

uses
  System.Threading; // 需要引用PPL库
1
2
定义两个执行过程:

    procedure NoTask; // 不使用任务的情况
    procedure ApplyTask; // 使用任务的情况
1
2
分别编写两个执行过程,这两个执行过程都将演示一个长时间计算的过程,该过程从您按下按钮开始。它休眠3秒钟(模拟需要计算的处理时间),然后显示0到10之间的一个随机数。

procedure TForm5.ApplyTask;
var
  lValue: Integer;
begin
  Label1.Text := '使用Task:--';
  TTask.Run(
    procedure
    begin
      { 暂停一段时间,模拟需要计算的处理时间 }
      Sleep(3000);
      lValue := Random(10);
      TThread.Synchronize(nil,
        procedure
        begin
          Label1.Text := '使用Task:' + lValue.ToString;
        end);
    end);
end;

procedure TForm5.NoTask;
var
  lValue: Integer;
begin
  Label1.Text := '未用Task--';
  { 暂停一段时间,模拟需要计算的处理时间 }
  Sleep(3000);
  lValue := Random(10);
  Label1.Text := '未用Task:' + lValue.ToString;
end;


创建按钮事件,当CheckBox1选中时执行任务,未选择时使用常用方式执行。

procedure TForm5.Button1Click(Sender: TObject);
begin
  if CheckBox1.IsChecked then
    ApplyTask
  else
    NoTask;
end;

演示效果


运行程序,将看到进度条自动增减的显示效果。
首先我们不选中CheckBox1,按下启动按钮并开始进行长时间计算,界面上进度条停止运动,直到计算完成进度条才能恢复运动显示。

其次,我们再选中CheckBox1,按下启动按钮并开始,界面上进度条保持原运动状态,3秒后得到计算结果,计算的执行过程中没有影响到界面任务的执行。
 

你可能感兴趣的:(java,开发语言)