使用AnonymousThread将值传递给onTerminate

时间:2014-09-23 07:46:02

标签: multithreading delphi delphi-xe2

我有一个正在运行的线程应用程序正在计算一些更长的计算。

procedure TForm.calculationInThread(value: Integer);
var aThread : TThread;
begin
  aThread :=
    TThread.CreateAnonymousThread(
      procedure
      begin
        myCalculation(value);           
      end
    );
  aThread.FreeOnTerminate := True;
  aThread.OnTerminate := self.calculationInThreadEnd;
  aThread.Start;
end; 

还有calculateInThreadEnd;

的实现
procedure TForm.calculationInThreadEnd(Sender: TObject);
begin
   doSomething;
end;

我可能会错过一些愚蠢的东西,但是如何将值传递给calculateInThreadEnd?我找到了

TThread.SetReturnValue(value);

但是如何在onTerminate调用中访问它?

解决方案

type THackThread = class(TThread);

procedure TForm1.calculationInThreadEnd(Sender: TObject);
var Value: Integer;
begin
    Value := THackThread(Sender as TThread).ReturnValue;  
end;

1 个答案:

答案 0 :(得分:4)

Sender事件的OnTerminate参数是线程对象。所以你可以这样做:

aThread :=
  TThread.CreateAnonymousThread(
    procedure
    begin
      myCalculation(value);           
      TThread.SetReturnValue(...);
    end
  );

然后在OnTerminate事件处理程序中执行:

procedure TForm.calculationInThreadEnd(Sender: TObject);
var
  Value: Integer;
begin
  Value := (Sender as TThread).ReturnValue;
end;

<强>更新

返回值属性受到保护,因此您需要使用受保护的hack来访问它。