delphi TTask无法传递参数的一个解决方案


本文整理自网络,侵删。

 
uses  System.Threading;

TTask只接受没有参数的过程,但现实开发中经常需要给任务传递特定参数。

先看看常规的写法

var
  tasks: TArray;
  i: Integer;
begin
  SetLength(tasks, 3);
  for i := 0 to 2 do
  begin
    tasks[i] := TTask.Run(
      procedure
      begin
        OutputdebugString(PChar(IntToStr(i)));
      end);
  end;
  TTask.WaitForAll(tasks);
end;
这样就形成了一个闭包,匿名方法中变量i的值是没有保障的。
最后,我通过增加一个包装类来解决
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;
    procedure Button1Click(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
uses
  System.Threading;
 
type
  TMyTask = class
  private
    _id: Integer;
    procedure Execute;
  public
    constructor Create(id: Integer);
    function Start: ITask;
  end;
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  list: TObjectList;
  tasks: TArray;
  i: Integer;
begin
  list := TObjectList.Create;
  list.Add(TMyTask.Create(1));
  list.Add(TMyTask.Create(2));
  list.Add(TMyTask.Create(3));
 
  SetLength(tasks, list.Count);
  for i := 0 to list.Count - 1 do
  begin
    tasks[i] := list[i].Start;
  end;
 
  TTask.WaitForAll(tasks);
  list.Free;
end;
 
{ TMyTask }
 
constructor TMyTask.Create(id: Integer);
begin
  _id := id;
end;
 
procedure TMyTask.Execute;
begin
  OutputdebugString(PChar(IntToStr(_id)));
end;
 
function TMyTask.Start: ITask;
begin
  Result := TTask.Run(Execute);
end;
 
end.
这样就实现了给任务传递参数的目的。
――――――――――――――――

原文链接:https://blog.csdn.net/aqtata/article/details/77197030

相关阅读 >>

Delphi 网上获取北京时间idhttpserver and idhttp 使用 encoding utf8

Delphi format格式化函数

Delphi多媒体函数

Delphi 获取路径分隔符

Delphi 取目录下指定文件到列表

Delphi中用拼音首字符序列来实现检索功能

Delphi中使用directx截屏函数

Delphi 安卓图像压缩bitmapcompress

Delphi 捕捉异常:try..except..end

Delphi rgbtohsb

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...