设为首页 加入收藏

TOP

delphi Parallel 之 TTask 初试
2017-10-09 13:26:52 】 浏览:1607
Tags:delphi Parallel TTask 初试
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  System.Generics.Collections;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    procedure TaskProc(Sender: TObject);
    function FutureEvent(Sender: TObject): string;
  public
    { Public declarations }
  end;


var
  Form1: TForm1;



implementation

{$R *.dfm}

uses
  System.Threading, System.SyncObjs, System.Diagnostics;

procedure TForm1.Button1Click(Sender: TObject);
var
  ATask: ITask;
begin
  ATask := TTask.Run(Self, Form1.TaskProc);
  ATask.Start;
  //阻塞至线程结束
  ATask.Wait;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  ATask: IFuture<string>;
begin
  ATask := TTask.Future<string>(function: string
    begin
      TThread.Sleep(3000);
      Result := DateTimeToStr(Now);
    end);
  //阻塞至线程结束
  Caption := ATask.Value;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  ATask: IFuture<string>;
begin
  ATask := TTask.Future<string>(Self, FutureEvent);
  //阻塞至线程结束
  Caption := ATask.Value;
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  TaskArray: TArray<ITask>;
  I: Integer;
begin
  SetLength(TaskArray, 5);
  for I := Low(TaskArray) to High(TaskArray) do
    TaskArray[I] := TTask.Run(procedure
      begin
        TThread.Sleep(1000);
      end);
  //阻塞至线程结束
  TTask.WaitForAll(TaskArray);
  ShowMessage('ok');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
end;

function TForm1.FutureEvent(Sender: TObject): string;
begin
  Result := DateTimeToStr(Now);
end;

procedure TForm1.TaskProc(Sender: TObject);
var
  I: Integer;
begin
  TThread.Sleep(3000);
  for I := 0 to 10 do
    TThread.Queue(nil, procedure
      begin
        Memo1.Lines.Add(Sender.ClassName);
      end);
end;

end.

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇delphi 多线程之System.TMonitor .. 下一篇delphi 多线程之System.TMonitor

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目