gpt4 book ai didi

multithreading - Delphi启动后将线程设置为nil

转载 作者:行者123 更新时间:2023-12-03 18:07:30 26 4
gpt4 key购买 nike

今天我错过了一节课,我发现了一行非常奇怪的代码,我看不懂。这是类:

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;

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

enter image description here

您单击 Button2“Create suspended”创建一个 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;

如你所见,为什么开始后有一个nil?我真的无法理解。既然是 FreeOnTerminate,我不应该忽略那一行吗?

最佳答案

MemoMessageThread 设置为 nil 会删除对实例化对象的引用。对象仍然存在并执行,但与对象的联系丢失了。

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

关于multithreading - Delphi启动后将线程设置为nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42182457/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com