请问,若在tthread类中使用了 FreeOnTerminate := true; 那么我还需要在主程序中显式地调用tthread.free来释放吗?另外,对于未使用FreeOnTerminate := true; 且已经挂起的线程,使用 Terminate; 后,还需要 用Resume 唤醒它,才能让它最后自释放吗?

解决方案 »

  1.   

    第一个显式释放问题查到资料,貌似设了FreeOnTerminate:= true会自动释放整个tthread对象,看来是FASTMM因为没有显式FREE,所以误报内存泄露了。第二个问题继续求解,因为看了源码中的waitfor,有个判断挂起然后resume的句子,所以希望确认一下。
    那么当我将一个FreeOnTerminate:= false的tthread手动释放时,是否应该这样:if stop then
    begin
    tthread.Suspend; //这里挂起是为了让线程停下,然后方便程序取一些全局变量
    //这中间是读取一些全局变量的代码
    tthread.FreeOnTerminate:=true;
    tthread.Terminate;
    tthread.Resume;
    end;以上代码,我在强行关闭程序时,会发生 thread error拒绝访问 错误, 发生在Suspend这里。我想知道程序在关闭时的执行顺序,在哪一步关闭并释放线程资源的,我在线程中使用了application.Terminated 来判断,会起作用吗?我调试时没跟踪到。
      

  2.   

    if Assigned(AThread) then
      begin
        AThread.Terminate;
        AThread.WaitFor;
        FreeAndNil(AThread);
      end;
      

  3.   

    不敢用waitfor因为线程里用了indy 的idftp,有可能阻塞,waitfor 会锁死free里就用了waitfor的
      

  4.   

    一般关闭窗体使用线程free的话,在Create构造函数中就不要使用freeonterminate:=true;
    线程自动释放了.再使用free,会出现错误
      

  5.   

    主程序中使用waitfor,有时会造成窗体界面卡死.
      

  6.   

    判断线程是否退出应该使用if 线程.Terminated then判断吧
      

  7.   

    那个stop是外部的命令变量了。这时还没给线程结束命令呢。重点是,suspend为什么会导致 thread error 拒绝访问错误。我还没freeonterminate:=true呢,也没让terminate
      

  8.   

    确认TTHREAD类不适合自释放,会导致程序错误。