线程中有连接远程数据库。如果执行中间网络有问题的话线程就停在那儿了,即使停止线程再启动还是没反映。需要整个程序退出再运行才行。停止及启动线程程序如下:procedure Tmain.Button1Click(Sender: TObject);
begin
  trans := transthread.Create(False);
  label1.Caption:='服务运行中';
  button1.Enabled:=false;
  button2.Enabled:=true;
end;procedure Tmain.Button2Click(Sender: TObject);
begin
  trans.Terminate;
  trans.WaitFor;
  trans.Free;
  label1.Caption:='服务已终止';
  button1.Enabled:=true;
  button2.Enabled:=false;
end;

解决方案 »

  1.   

    >>  trans.Free;
    改為
    FreeAndNil(  trans);不過, 還要看其它代碼的設置
      

  2.   

    procedure Tmain.Button1Click(Sender: TObject);
    begin
      trans := transthread.Create(False);  trans.Terminated:=True;    //增加此句试试  label1.Caption:='服务运行中';
      button1.Enabled:=false;
      button2.Enabled:=true;
    end;
      

  3.   

    楼上都未解决问题。
    实际情况是,在网络正常(也就是线程里的程序都可正常运行下去)时,用我以上两个程序都是可以正常启动和停止线程的。问题在于,一旦线程非正常中断(就是在执行时中断了,但没有出错信息),死在那儿了,那么再运行停止和启动程序,不能正常启动线程,除非把程序关了,再运行,就又正常了。是不是说,  trans.Terminate;  trans.WaitFor;trans.Free;这三句不能完全释放线程?(即使用freeandnil(trans))
      

  4.   

    把线程中Create那 代码贴出来, 里在应该有连接数据库的操作,线程结束后,那里面的资源没有释放, 也就是说在线程开始时,一定要再连接一 遍数据库!
      

  5.   

    Terminate只是发出Terminated=True信号,并不会实际终止线程。如果线程中出现死锁,waitfor将永远不会返回,这样free语句根本不起作用。多线程内部有相当复杂的运行机制,对于线程的退出,我也在寻找好的解决办法。
    现在我只有使用TerminateThread来终止——头痛。
      

  6.   

    再强调,我现在求解的是线程内程序出现异常导致的线程死掉而无法FREE和重新启动的解决办法。正常情况下我的线程是完全可以正常的停止和启动的!
    或者从另一方面求解,线程内的程序应该如何建立强壮的错误检测机制以拦截所有可能发生的错误,并以此自动结束线程。
    我的线程程序:
    procedure transthread.Execute;
    begin
      setlog('传输服务已启动:'+datetimetostr(now));
      while not Terminated do
      begin
        数据传输程序...
      end;
      setlog('传输服务已终止:'+datetimetostr(now));
    end;
      

  7.   

    application.ProcessMessages ;搞定它!
      

  8.   

    你下面的程序执行到,waitfor就停住了.
    procedure Tmain.Button2Click(Sender: TObject);
    begin
      trans.Terminate;
      trans.WaitFor;
      trans.Free;
      label1.Caption:='服务已终止';
      button1.Enabled:=true;
      button2.Enabled:=false;
    end;应改为:
    你下面的程序执行到,waitfor就停住了.
    procedure Tmain.Button2Click(Sender: TObject);
    begin
      trans.Terminate := true;
      trans.WaitFor;
      trans.Free;
      label1.Caption:='服务已终止';
      button1.Enabled:=true;
      button2.Enabled:=false;
    end;
      

  9.   

    To:IFindit(寻找其中的乐趣) :
      trans.Terminate;这句会置trans.Terminate为true的。
    唉,楼上几位难道还实没看明白我的表达么(寒,是我口齿不清么?),
    在线程里的程序没遇到错误(比如网络中断导致连接数据库或者执行查询失败)时,我的程序是完全可以正常工作的。我要问的是在出错时为什么不能再正常起动线程。