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
最近又研究了一下安全结束线程的方法,又有一些新发现。

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 tdirectory.getdirectories

Delphi winapi: getnextwindow - 获取指定窗口z上或z下的窗口的句柄

Delphi system 提供的编译期函数

截取程序的网络封包(Delphi hook api)

Delphi win32_networkadapter 网卡 参数说明

Delphi xe增强的rtti妙用--动态创建包中的窗口类

Delphi 获取文件夹路径最后一级文件夹目录名称

Delphi 异或加解密

Delphi自动提交网页表单和获取框架网页源码

Delphi webservices传base64字串

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...