Delphi启动后将线程设置为nil

Raf*_*ssi 2 delphi multithreading

今天我错过了一课,我发现了一段我无法理解的奇怪的代码.这是班级:

type
 TMemoMessageThread = class(TThread)
  strict private
   FMemo: TMemo;
   FMemoMessage: string;
  protected
   procedure Execute; override;
  public
   constructor Create(aMemo: TMemo);
   property MemoMessage: string read FMemoMessage write FMemoMessage;
 end;
Run Code Online (Sandbox Code Playgroud)

在这里,我创建了一个从TThread下降的类,因为我想模拟一个繁重的计算.看看非常简单的UI.

在此输入图像描述

单击Button2"创建暂停",创建一个Suspended线程,然后按此线程Button3.这是代码:

constructor TMemoMessageThread.Create(aMemo: TMemo);
begin

 if (aMemo = nil) then
  raise Exception.Create('tMemo non valid!!!');

 inherited Create(True);
 FreeOnTerminate := True;
 FMemo := aMemo;

end;

procedure TMemoMessageThread.Execute;
begin

 Synchronize(procedure
             begin
              FMemo.Lines.Add('... process in parallel thread ...');
             end);

 Sleep(7000); //simulate something heavy to compute

 Synchronize(procedure
             begin
              FMemo.Lines.Add(FMemoMessage + '. Done! :)');
             end);

end;

procedure TForm1.Button2Click(Sender: TObject);
begin

 MemoMessageThread := TMemoMessageThread.Create(Memo1);
 MemoMessageThread.MemoMessage := 'Hello from TMemoMessageThread';
 Button3.Enabled := true;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 MemoMessageThread.Start;
 MemoMessageThread := nil; //why nil after start?
end;
Run Code Online (Sandbox Code Playgroud)

如你所见,为什么开始后会有一个零?我真的无法理解.既然FreeOnTerminate不应该忽略那条线?

LU *_* RD 6

设置MemoMessageThreadnil删除对实例化对象的引用.对象仍然存在并执行,但与对象的联系丢失.

由于创建了线程FreeOnTerminate,因此无论如何都不应该使用对象的引用.这是将其设置nil为我所能看到的唯一目的.