var
 th:a:procedure a.Execute ;
begin
try
FreeOnTerminate := true;
.....
finally
th.Terminate;
end;
end;有没有可能程序运行到了th.Terminate,但是线程没有真正结束?

解决方案 »

  1.   

    Classes单元的ThreadProc才是真正在线程中跑的全部代码,Execute只不过是其中的一部分!!!function ThreadProc(Thread: TThread): Integer;
    var
      FreeThread: Boolean;
    begin
    {$IFDEF LINUX}
      if Thread.FSuspended then sem_wait(Thread.FCreateSuspendedSem);
    {$ENDIF}
      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 FreeAndNil(Thread);
    {$IFDEF MSWINDOWS}
        EndThread(Result);
    {$ENDIF}
    {$IFDEF LINUX}
        // Directly call pthread_exit since EndThread will detach the thread causing
        // the pthread_join in TThread.WaitFor to fail.  Also, make sure the EndThreadProc
        // is called just like EndThread would do. EndThreadProc should not return
        // and call pthread_exit itself.
        if Assigned(EndThreadProc) then
          EndThreadProc(Result);
        pthread_exit(Pointer(Result));
    {$ENDIF}
      end;
    end;
      

  2.   

    按照楼上的,也就是说Execute结束,线程也未必是结束的?
      

  3.   

    FreeOnTerminate := true;//是运行完毕后释放呀
      

  4.   

    主程序要视情况反复创建调用线程实例th,如果前面一个th未完全执行完毕,又一次产生新的th实例将产生异常。所以,必须确保前一个实例th完全结束了,才能根据情况产生一个新的实例。因此,我现在要确保前一个实例结束。
      

  5.   

    像这种情况,在线程的OnTerminate事件里头再产生新实例就行了!
      

  6.   

    lZ可能是期望,只需要时再创建实例。其实,不必这样反复销毁、创建。可以通过事件对象,作为通知媒介。
    1、在子线程内构造一个循环,访问事件对象;
    2、可以waitforSingleObject,等待事件对象,有信号时,则执行;
    3、主线程需要子线程“干活”时,设置事件对象为有信号状态即可;
    4、注意应用场合,调整线程优先级,分析子线程可能获得执行的几率
      

  7.   

    我一般是在线程里用一个while true做死循环,然后线程里判断一个全局变量的值,当值符合条件时再运行线程里的代码,不知道这样做对不对,只是在我的程序里暂时没出现什么异常,用着也方便(我每个线程类都只有一个实例)
      

  8.   

    没有可能一个线程的Execute运行结束,但线程未真正结束!
      

  9.   

    Execute运行结束,线程也就结束了