類 Create 了就要 Free;
但 TThread(的子類) 有特殊性, 很多時候我們不能確定新建的線程什么時候執行完(也就是什么時候該釋放);
如果線程執行完畢自己知道釋放就好了, 所以 TThread 給了一個布爾屬性 FreeOnTerminate, 如果為 True, 線程執行完畢后就會自釋放.
首先看下面的例程
type TMyThread = class(TThread) protected procedure Execute; override; end; procedure TMyThread.Execute; var i: Integer; begin FreeOnTerminate := True; {這可以讓線程執行完畢后隨即釋放} for i := 0 to 500000 do begin Form1.Canvas.Lock; Form1.Canvas.TextOut(10, 10, IntToStr(i)); Form1.Canvas.Unlock; end; end; procedure TForm1.Button1Click(Sender: TObject); begin TMyThread.Create(False); end;
TThread 類有一個抽象方法(Execute), 因而是個抽象類, 抽象類只能繼承使用, 上面是繼承為 TMyThread.
繼承 TThread 主要就是實現抽象方法 Execute(把我們的代碼寫在里面), 等我們的 TMyThread 實例化后, 首先就會執行 Execute 方法中的代碼.
按常規我們一般這樣去實例化:
procedure TForm1.Button1Click(Sender: TObject); var MyThread: TMyThread; begin MyThread := TMyThread.Create(False); end;
因為 MyThread 變量在這里毫無用處(並且編譯器還有提示), 所以不如直接寫做 TMyThread.Create(False);
關於 FreeOnTerminate
在 TThread 類的例子中, 應該有這句: FreeOnTerminate := True;
先說它什么意思:
類 Create 了就要 Free;
但 TThread(的子類) 有特殊性, 很多時候我們不能確定新建的線程什么時候執行完(也就是什么時候該釋放);
如果線程執行完畢自己知道釋放就好了, 所以 TThread 給了一個布爾屬性 FreeOnTerminate, 如果為 True, 線程執行完畢后就會自釋放.
有些書介紹說: FreeOnTerminate 的默認值是 True(錯誤!), 經落實, 應該是 False, 起碼在 Delphi 2007 和 2009 中是這樣; 或許以前的某個版本和現在不一樣。現在不考慮是哪個版本,也不考慮FreeOnTerminate的默認值是True 還是False,去顯式地將它設置為 True就可以避免這些問題