Delphi的TThread中的FreeOnTerminate成員


  類 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就可以避免這些問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM