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 廃棄後もメモリ上に参照先が残っているだけの可能性もあるため、実行クラスのメンバ参照が保証されるかは疑問です
コメント