我想子类化TThread
,以便有一个线程类,当 时FreeOnTerminate = True
,设置nil
为其引用变量。换句话说,我想做这样的事情:
TFreeAndNilThread = class(TThread)
private
FReferenceObj: TFreeAndNilThread; //?? // <-- here I'm holding the reference to myself
protected
procedure Execute;
procedure DoTerminate; override; // <-- here I'll set FReferenceObj to nil after inherited (only if FreeAndNil = True)
public
constructor Create(CreateSuspended: Boolean; var ReferenceObj); reintroduce; <-- untyped param like FreeAndNil and TApplication.CreateForm ??
end;
消费者代码应该是这样的:
var
MyThread: TFreeAndNilThread;
begin
MyThread := TFreeAndNilThread.Create(True, MyThread);
MyThread.FreeOnTerminate := True;
MyThread.Resume;
end;
...然后我可以安全地测试Assigned(MyThread)
.
我看到如何FreeAndNil
设法将无类型参数传递的引用对象设置为nil
,但它在本地执行此操作。在我的情况下,我应该将它“保存”到一个类字段 ( FReferenceObj
) 并在另一个地方 ( ) 使其为零DoTerminate
。
如何正确传递、存储和检索它?我可以考虑传递和存储 MyThread 的地址而不是 MyThread 本身,但我希望有更优雅的方式。
谢谢!