我有一个正在运行的线程应用程序正在计算一些更长的计算。
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;
答案 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来访问它。