本文整理自网络,侵删。
在开发过程中,不可避免的要用到多线程,而线程的同步、释放等又可能引入新的问题,不过网上已有许多资料,这里重点说下我使用的方法。
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最近又研究了一下安全结束线程的方法,又有一些新发现。
Delphi 2007及以前是没有线程的Finished属性的(好像是Delphi 2009以后才有的,具体没有深究),以上方法无法使用。
线程自己的Free方法其实是很完善的(用Delphi XE 10.3,其它未测试),可以直接使用,但前提是不使用FreeOnTerminate := True;,否则会调用两次Destroy,肯定要报错了!如此看来,若坚持谁创建谁释放的原则,FreeOnTerminate := True;根本没有用武之地。
既然Free可以使用,FreeAndNil自然也可以使用。
来源:https://my.oschina.net/afrusrsc/blog/3043629
相关阅读 >>
Delphi fileopendialog1 多选加载大量文件,不受中文文件名影响
更多相关阅读请进入《Delphi》频道 >>