我在线程里加了一个循环,然后在DESTROY中用OUTPUTDEBUGSTRING跟踪,发现EXECUTE循环还没结束就执行了DESTROY,请问这是怎么回事?

解决方案 »

  1.   

    execute and destroy are not running in same thread.
      

  2.   

    execute不是在本身线程被调用么?那是在哪个线程在被调用?
      

  3.   

    execute不是在本身线程被调用么?
    这我也觉得奇怪
      

  4.   

    inherited;
      try
       try
       //repeat
          while (not FQuited) and (WaitForSingleObject(FStartEvent,INFINITE)=WAIT_OBJECT_0)   do
          begin
            ResetEvent(FStartEvent);
                s:=InttoStr(Handle)+'已经执行一次';
                OutputDebugString(Pchar(s));
            try
              EnterCriticalSection(FCritic);
              InterLockedIncrement(RoomCount);
              //SetEvent(FEvent^);
              SetEvent(FStopEvent);
              if RoomCount>High(RoomAry) then 
                FQuited:=True;
           finally
             LeaveCriticalSection(FCritic);
          end;
        until FQuited=True;
      finally
        if FTCPClient.Connected then   
           FTCPClient.Disconnect;//我怀疑是这一句引发异常而导致后面语句没有执行,但我不  知道这句话为什么会引发异常,这是INDY10的组件    OutputDebugString(Pchar(s));
        CloseHandle(FStartEvent);
        CloseHandle(FStopEvent);
      

  5.   

    你是想在线程结束后再执行某些代码就不能这样写:
      with TCreateSectThread.Create(参数) do
        OnTerminate := MyThreadDone;procedure MyThreadDone(Sender: TObject);
    procedure TForm1.MyThreadDone(Sender: TObject);
    begin
      //线程结束后要执行的代码
    end;
      

  6.   

    TThread.Destroy中会调用terminate然后用waitfor等待线程执行结束, 而你override的Destroy被调用时(这个是你调用free时触发的)线程当然还没有结束了.