带参数的Delphi PPL TTask过程

时间:2018-06-21 14:01:53

标签: multithreading delphi

我不知道如何创建一个带有参数的过程的TTask,没有参数的过程有效,而有参数的过程却没有。

示例

PyMC3

然后我想创建4个这样的任务:

procedure TMain.SYNC(AProgressBar: TProgressBar; ASleep: Integer);
var i : integer;
begin
  for i := 0 to 100 do
    begin
      sleep(ASleep);

      TThread.Queue(TThread.CurrentThread,
      procedure
      begin
        AProgressBar.Position:=i;
      end);

    end;
end;

3 个答案:

答案 0 :(得分:2)

TTaskanonymous procedures一起使用。您可以capture the values传递给您的方法,例如:

SetLength(Tasks, 4);

Tasks[0] := TTask.Create(
  procedure
  begin
    SYNC(progressThread1, 100);
  end
);
Tasks[1] := TTask.Create(
  procedure
  begin
    SYNC(progressThread2, 150);
  end
);
Tasks[2] := TTask.Create(
  procedure
  begin
    SYNC(progressThread3, 300);
  end
);
Tasks[3] := TTask.Create(
  procedure
  begin
    SYNC(progressThread4, 200);
  end
);

Tasks[0].Start;
Tasks[1].Start;
Tasks[2].Start;
Tasks[3].Start;

答案 1 :(得分:1)

扩展Remy的答案,您还可以编写一个函数,该函数返回传递给任务的匿名函数。

function MakeSync(AProgressBar: TProgressBar; ASleep: integer): TProc;
begin
  Result :=
    procedure
    begin
      SYNC(AProgressBar, ASleep);
    end;
end;

SetLength(Tasks, 4);

Tasks[0] := TTask.Create(MakeSYNC(progressThread1, 100));
Tasks[1] := TTask.Create(MakeSYNC(progressThread2, 150));
Tasks[2] := TTask.Create(MakeSYNC(progressThread3, 300));
Tasks[3] := TTask.Create(MakeSYNC(progressThread4, 200));

Tasks[0].Start;
Tasks[1].Start;
Tasks[2].Start;
Tasks[3].Start;

答案 2 :(得分:0)

扩展雷米的答案。

以索引TThread.Queue调用i的循环0..100遭受了使用i参考值而不是传递值更新进度条的麻烦。

要更好地查看此结果,请删除睡眠调用并将i值添加到备忘录中。这将显示类似于以下内容的序列:

42
101
101
101
...
101

以下是在调用i时如何捕获TThread.Queue的值的示例:

procedure TMain.SYNC(AProgressBar: TProgressBar; ASleep: Integer);
  function CaptureValue( ix : Integer) : TThreadProcedure;
  begin
    Result :=
      procedure
      begin
        AProgressBar.Position := ix;
      end;
  end;
var i : integer;
begin
  for i := 0 to 100 do
    begin
      sleep(ASleep);
      TThread.Queue(TThread.CurrentThread, CaptureValue(i) );
    end;
end;