Delphi で無名スレッド実行中に親オブジェクトを破棄するとスレッドはどうなるのか
Delphi で無名スレッド実行中に親オブジェクトを破棄するとスレッドはどうなるのか → 親オブジェクト破棄後も実行し続ける
以下、MyClass 内の無名スレッドから Caption へカウントダウンを表示するプログラムの抜粋、スレッド開始1秒後に MyClassを破棄しているが、カウントダウンはそのまま続行されます
ちなみに TThread.CurrentThread に Terminated プロパティは存在しません
type
TMyClass = class(TObject)
private
public
FForm: TForm;
constructor Create;
destructor Destroy; override;
procedure StrtThread;
end;
implementation
procedure TMyClass.StrtThread;
begin
TThread.CreateAnonymousThread(
procedure
var
I: Integer;
FFForm: TForm;
begin
FFForm := FForm;
for I := 10 downto 0 do begin
TThread.Synchronize(TThread.CurrentThread,
procedure()
begin
FFForm.Caption := IntToStr(I);
end);
Sleep(1000);
end;
end).Start;
end;
// MyClass生成と廃棄
procedure TForm1.Button1Click(Sender: TObject);
var
MyClass: TMyClass;
begin
MyClass := TMyClass.Create;
try
MyClass.FForm := Self;
MyClass.StrtThread;
Sleep(1000);
finally
MyClass.Free;
end;
end;
スレッドの独立性を保つため、FFForm := FForm を行っているが、MyClass.FFormを参照しつづけてもカウントダウンは続行された、これは MyClass 廃棄後もメモリ上に参照先が残っているだけの可能性もあるため、実行クラスのメンバ参照が保証されるかは疑問です
コメント