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不应该忽略那条线?
设置MemoMessageThread以nil删除对实例化对象的引用.对象仍然存在并执行,但与对象的联系丢失.
由于创建了线程FreeOnTerminate,因此无论如何都不应该使用对象的引用.这是将其设置nil为我所能看到的唯一目的.