【Delphi】TTask无法传递参数的一个解决方案
2017-08-15 17:05
253 查看
TTask只接受没有参数的过程,但现实开发中经常需要给任务传递特定参数。
先看看常规的写法
var
tasks: TArray<ITask>;
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<TMyTask>;
tasks: TArray<ITask>;
i: Integer;
begin
list := TObjectList<TMyTask>.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.这样就实现了给任务传递参数的目的。
先看看常规的写法
var
tasks: TArray<ITask>;
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<TMyTask>;
tasks: TArray<ITask>;
i: Integer;
begin
list := TObjectList<TMyTask>.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.这样就实现了给任务传递参数的目的。
相关文章推荐
- 【工作记录0022】C#(.NET)调用Java开发的WebService(wsdl),客户端传递非string类型参数(int,double,bool等),而服务端无法获取到参数值的解决方案
- Delphi动态事件深入分析(对象方法在调用的时候会传递一个隐含的Self指针,而该指针的值在EAX中。即左边第一个参数)
- SQL中函数返回表,传递一个参数,无法唤醒用户自定义函数,解决方法!
- findContours函数报错:“将一个无效参数传递给了将无效参数视为严重错误的函数”解决方案之一
- 通过一个内存泄露例子体会参数传递
- JS调用ashx文件传递中文参数取不到值的解决方案
- Mac OS ssh-copy-id Command not found 导致无法对目标服务器上传一个公钥的问题解决方案
- Delphi 参数传递
- Spring MVC 作业过程中传递参数为集合List的解决方案
- JS中setInterval、setTimeout不能传递带参数的函数的解决方案
- Android深入探究笔记之二 -- 打开一个新的 Activity 并传递参数与如何响应控件的点击事件
- c#WINFROM窗体之间传递参数的解决方案
- Silverlight关于窗体的跳转及传递参数的解决方案
- AWAY3D4BETA版在ipad移动设备上无法使用手指触发某一个3d对象的解决方案
- visual studio 2010 创建新项目时,提示无法找到项目模板的一个解决方案 或者 无法从项目模版中加载xxx文件
- 关于C语言中函数调用和参数传递机制的探讨(二 .传递一个参数)
- SpringMVC中用@ParamVariable传递的参数包含斜杠(/)时,匹配不了报404错误的解决方案(转)
- extjs 一次性用一个参数传递多个数据的做法和美化等待信息
- XML,Dictionary的应用---有关于页面之间接收和传递参数的又一解决方案 [原创]
- jmater测试web,多个http请求session无法传递的问题及解决方案