在開發過程當中,不可避免的要用到多線程,而線程的同步、釋放等又可能引入新的問題,不過網上已有許多資料,這裏重點說下我使用的方法。編程
type TMyThread = class(TThread) protected procedure Execute; override; public constructor Create(...); destructor Destroy; override; //使用 reintroduce 關鍵字能夠明確通知編譯器屏蔽父類的同名方法而使用本身的方法。 procedure Free; reintroduce; end; constructor TMyThread.Create(...); begin { 在這裏建立相關對象,能夠省去先掛起線程再恢復的操做 } inherited Create; end; destructor TMyThread.Destroy; begin { 在這裏釋放相關資源 } inherited Destroy; end; procedure TMyThread.Execute; begin FreeOnTerminate := True; while not Terminated do begin { 線程處理 } Sleep(100); //根據實際狀況設置 end; end; procedure TMyThread.Free; begin //終止線程 Terminate; //等待線程結束 while not Finished do Sleep(1); end;
這樣一來,就能夠像普通類同樣使用Free
來釋放線程了,可是不能使用FreeAndNil
進行釋放。安全
固然,必定要調用Free
才行。良好的編程習慣仍是要有的!多線程
最近又研究了一下安全結束線程的方法,又有一些新發現。ide
Delphi 2007
及之前是沒有線程的Finished
屬性的(好像是Delphi 2009
之後纔有的,具體沒有深究),以上方法沒法使用。測試
線程本身的Free
方法實際上是很完善的(用Delphi XE 10.3
,其它未測試),能夠直接使用,但前提是不使用FreeOnTerminate := True;
,不然會調用兩次Destroy
,確定要報錯了!如此看來,若堅持誰建立誰釋放的原則,FreeOnTerminate := True;
根本沒有用武之地。線程
既然Free
能夠使用,FreeAndNil
天然也能夠使用。code