在开发过程当中,不可避免的要用到多线程,而线程的同步、释放等又可能引入新的问题,不过网上已有许多资料,这里重点说下我使用的方法。编程
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