我一直在試圖設置FreeOnTerminate
屬性在的OnTerminate
程序,但它似乎像它要麼爲時已晚來設置它,或者它完全無視write
程序。設置/更改TThread.FreeOnTerminate同時TThread.OnTerminate
我該如何設置/更改FreeOnTerminate
屬性inOnTerminate
程序? 是否有任何解決方法?
一些代碼:
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure OnTestThreadTerminate (Sender : TObject);
public
{ Public declarations }
end;
type
TTestThread = class (TThread)
public
procedure Execute; override;
end;
var
Form2: TForm2;
GlobalThreadTest : TTestThread;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
GlobalThreadTest := TTestThread.Create (True);
GlobalThreadTest.OnTerminate := Self.OnTestThreadTerminate;
GlobalThreadTest.FreeOnTerminate := True;
GlobalThreadTest.Resume;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
// 2nd Button to try to free the thread...
// AFTER BUTTON1 has been clicked!
try
GlobalThreadTest.Free;
except
on e : exception do begin
MessageBox(Self.Handle, pchar(e.Message), pchar(e.ClassName), 64);
end;
end;
end;
procedure TForm2.OnTestThreadTerminate(Sender: TObject);
begin
TTestThread(Sender).FreeOnTerminate := False; // Avoid freeing...
ShowMessage (BoolToStr (TTestThread(Sender).FreeOnTerminate, True)); // FreeOnTerminate Value has been changed successfully!
end;
procedure TTestThread.Execute;
begin
// No code needed for test purposes.
end;
end.
您有數據競賽。 一旦您將FreeOnTerminate設置爲True,並致電Resume或 開始,那麼您將不再可靠地參照線索 。 FreeOnTerminate的設計是它被設置爲 真一次,永遠不會被修改。無論你在做什麼 ,你的解決方案都是錯誤的。 –
設置FreeOnTerminate當您希望免除對線程對象的自由調用 。當你使用 時,你不能持有對線程實例的引用。 如果您想要破壞線程 ,請不要設置FreeOnTerminate。 –
@DavidHeffernan我只是不明白爲什麼它不會工作。實現這樣的細節並不是什麼大事。在'OnTerminate'完成後最後一次檢查'FreeOnTerminate'應該很容易...謝謝您的信息。 –