在线程的Execute函数执行完后,使用windows的任务管理器查看线程数,显示线程还在。
在Execute函数中也设置了self.FreeOnTerminate := True。其他的线程也是这样处理的,可以正常终止,不知道这个线程为什么会这样?

解决方案 »

  1.   

    FreeOnTerminate 不会强制终止线程,只是告诉它会在合适的时候释放,强制执行可以用API的函数,不过不建议那样做
      

  2.   


    //我建议把那个异常线程单拿出来,在以下函数处做断点处理!下面是线程类封装的线程函数!
    function ThreadProc(Thread: TThread): Integer;
    var
      FreeThread: Boolean;
    begin
     
      try
        if not Thread.Terminated then
        try
          Thread.Execute;
        except
          Thread.FFatalException := AcquireExceptionObject;
        end;
      finally
        FreeThread := Thread.FFreeOnTerminate;
        Result := Thread.FReturnValue;
        Thread.DoTerminate;
        Thread.FFinished := True;
        SignalSyncEvent;
        if FreeThread then Thread.Free;//这个地方比较关键,跟踪一下!
     
        EndThread(Result);
     
      end;
    end;
      

  3.   

    对你看一下Execute的函数是否执行完了,如果没执行完当然不会退出。
      

  4.   

    excute里的代码有可能尚未走完,在做其它程序操作之前你最好延时一段时间,比如关闭串口。
      

  5.   

    我在execute的最后打印一个输出,可以确认execute走完了。不过在打印这个最后一条记录的之前另有一个线程启动了。因为从打印的记录上看,另一个线程打印了两条后,这个线程才打印了最后的这个记录。
    所以,我想是不是另一个线程的启动干扰了这个线程的释放。当然,这两个线程之间没有什么联系。
      

  6.   

    启动线程是异步的,也就是在你这个线程中启动另外一个线程,你不调用WaitForSingleObject等函数来等待的话,就不会阻止当前线程的执行。
      

  7.   

    最终也没找到原因。
    做了一个处理,执行关掉线程时,等待一定时间,然后用GetExitCodeThread检查线程是否终止。如果还在直接TerminateThread。