Delphi安全結束線程

在開發過程當中,不可避免的要用到多線程,而線程的同步、釋放等又可能引入新的問題,不過網上已有許多資料,這裏重點說下我使用的方法。編程

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才行。良好的編程習慣仍是要有的!多線程


2019-09-07

最近又研究了一下安全結束線程的方法,又有一些新發現。ide

  1. Delphi 2007及之前是沒有線程的Finished屬性的(好像是Delphi 2009之後纔有的,具體沒有深究),以上方法沒法使用。測試

  2. 線程本身的Free方法實際上是很完善的(用Delphi XE 10.3,其它未測試),能夠直接使用,但前提是不使用FreeOnTerminate := True;,不然會調用兩次Destroy,確定要報錯了!如此看來,若堅持誰建立誰釋放的原則,FreeOnTerminate := True;根本沒有用武之地。線程

  3. 既然Free能夠使用,FreeAndNil天然也能夠使用。code

相關文章
相關標籤/搜索