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