constructor TConvertThread.Create(iGroupId: integer; sGroupName: string);
begin
  inherited Create(True);
  FreeOnTerminate := True;
  iCvtGroupId := iGroupId;
  sCvtGroupName := sGroupName;
end;
destructor TConvertThread.Destroy;
begin
  Self.sMsg := '转换线程' + '[' + sCvtGroupName + ']' + '停止!';
  Self.sShowMsg := Self.sMsg;
  inherited Destroy;
end;
-------------主线程调用线程代码--------
    ConvtThread := TConvertThread.Create(0,'0');
    ConvtThread.Resume;
-------------主线程释放代码------------
    ConvtThread.Terminate;
    ConvtThread.WaitFor;
--------------------------------
释放时报
  System Error.Code: 6.句柄无效
其中如果用delphi5编译不报错,用delphi6编译执行就报这个错,去掉inherited Destroy;就不报错了,但是我不知道原因是什么?
  

解决方案 »

  1.   

    TConvertThread  直接从 TThread 继承的??
      

  2.   

    FreeOnTerminate := True; 表示线程结束后会自动释放-------------主线程释放代码------------ 
        ConvtThread.Terminate; 
        ConvtThread.WaitFor; 
    --------------------------------你自己又释放了一次,肯定要出错嘛
      

  3.   

    类声明语句如下:
     TConvertThread = class(TThread)
      protected
        procedure Execute; override;
      public
        constructor Create(iGroupId: integer; sGroupName: string);
        destructor Destroy override;
          end;
    ----------------------------------
    FreeOnTerminate := True; 表示线程结束后会自动释放,虽然说是自动释放,但是如果我的类里自行分配了内存,那也得调用destory过程进行释放吧!
      

  4.   

    都说了是“Free”OnTerminate了,别人帮你释放了。
      

  5.   

    原因可能如下
      FreeOnTerminate:= true后,一旦程序发出 ConvtThread.Terminate;系统会自动去调用destory进行释放,这时候再去调用ConvtThread.waitfor,因为对象ConvtThread不存在了,而waitfor会调用windows api去取句柄,从而导致产生句柄无效的错误,所以正确的方法是 FreeOnTerminate置为false,然后用下列代码进行线程的释放
         ConvtThread.Terminate; 
        ConvtThread.WaitFor; 
        ConvtThread.free;
    或者
      FreeOnTerminate := true;
       ConvtThread.Terminate;
       try 
        ConvtThread.WaitFor; 
       except
        end;
    谢谢各位了.