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

相关文章
相关标签/搜索