这个问题问的很多,但大多数最后是不了了之。
我目前这么做:
procedure a.Execute ;
begin
try
  inherited;
FreeOnTerminate := true;
....//创建ado,tstringlist等
....//其他执行代码
end;destructor a.Destroy;
begin
 //这里释放所有动态创建的内容,如ado,tstringlist等
 inherited;
end;这样写是不是可以确保线程资源全部释放掉了?

解决方案 »

  1.   

    不建议在Destroy中释放资源,建议如下处理:
    procedure a.Execute ;
    begin
    inherited;
      FreeOnTerminate := true;
      try
        //创建ado,tstringlist等
        //……
        //其他执行代码
        //……
      finally
        //这里释放所有动态创建的内容,如ado,tstringlist等
      end;
    end;
      

  2.   

    那destructor a.Destroy;里面写什么呢?
      

  3.   

    如果没有特殊的需要,完全可以不用继承Create和Destroy过程。
      

  4.   

    因为FreeOnTerminate等于True了,所以在Destroy中写是一样的
      

  5.   

    直接在Execute 的尾部写上动态创建对象的释放代码就可以了
      

  6.   

    我认为楼主bwe2009的写法比较好。而gobiz的方法,我有一个疑问,在如下代码中,如果程序执行到 //其他执行代码 部分,而在此时线程被强行终止,如调用TerminateThread,代码能否执行进入finally部分?我没测试过,请试过的人发表一下看法
      

  7.   

    首先要熟悉线程的一些基本属性,比如FreeOnTerminate(True时线程执行体结束线程自动释放资源,false必须你手动调用)等,这些基本的设置可以Create构造函数,一些资源的申请在Create,释放在Destroy,Execute主要放执行代码,如果申请要记住释放。销毁线程时注意是否被挂起,否则会存在等待不到事件导致线程永远退不出。
      

  8.   

    如果资源申请在Execute,会有什么后果呢?我感觉是一样的
      

  9.   

    线程最大的问题是它的终止有时是不可控的,如果execute只是自己的简单循环,基本都能完全释放
    不可控的例子如Tdoscommand,线程控制一个外部命令行进程。。
      

  10.   

    我认为 11 楼的说法正确,在哪里创建的对象,就在哪里释放。如果是在 Create 过程中创建的对象,则在 Destroy 中释放,如果是在 Execute 过程中生成的对象,则在 Execute 过程中释放。
      

  11.   

    如果在线程的Public声明的对象,我在execute创建,我也在execute销毁,这种做法妥当否?
      

  12.   

    如果是Public声明的对象,就应该在Create中创建,而不是在Execute中创建
      

  13.   

    如果是Public声明的对象,就应该在Create中创建,而不是在Execute中创建我目前在execute创建,也在execute销毁,这种做法有什么不妥?请明示。
      

  14.   

    假如你创建线程时挂起,然后设置属性,会发生什么?还没创建呢!创建线程用:
    th0:=findbt.Create(true); //标题线程
    th0.Resume ;这样有可能线程挂起?然后我在execute设置属性就有可能出错?
    那是不是应该在create设置属性就OK了?
      

  15.   

    Resume之前就去访问你execute里才创建的对象
      

  16.   

    Resume之前就去访问你execute里才创建的对象?我是这样创建线程的
    th0:=findbt.Create(true); //标题线程
    th0.Resume ;哪里有Resume之前就去访问你execute里才创建的对象?
      

  17.   

    如果你这个对象是public的,别人就应该有权访问,凭什么不让别人在resume之前访问属性和方法?很多时候创建完毕后要根据需要设置线程的属性或者调用其他public方法。写代码不要只考虑自己用,要当成给别人写的。
      

  18.   

    type
     findbt=class(TThread)//创建发现内容的线程
     private
     procedure getweb(var s,sdz,swz,swzlb,swzys:string);
     function clearzy(var s:string):string;
     function clearhtml(var s:string):string;
     function _Get(var url,scookie:string) : String;
     function clearjava(s:string):string;
     function cutdate(slk:string):string;
     protected
       Procedure Execute;override;
       procedure showlabel;
       procedure showstop;
       procedure showend;
       destructor Destroy; override;
     public
       lab:tdxlabel;
       errorflag:integer;
       bzwz:string;//bzwz是标准网址的样式
       adoxc,adobase:tadodataset;
       resp : TStringlist;
       linktp,zt,link:tstringlist;//获取链接的临时数据存放结构
       aidhttp1:tidhttp;
       btbase1,btbase2,btbase3,btbase4,btbase5,btbase6:tstringlist;//网址变量
    end;BambooCaep,看看这样有何不妥?我现在对:
    adoxc,adobase:tadodataset;
    resp : TStringlist;
    linktp,zt,link:tstringlist;//获取链接的临时数据存放结构
    aidhttp1:tidhttp;
    btbase1,btbase2,btbase3,btbase4,btbase5,btbase6:tstringlist;//网址变量全部在execute创建和释放,有很不妥呢?