我使用INDY控件编写数据接收程序,采用单独线程接收,基于阻塞式的,可是当关闭事总是出现错误啊!后来,我仔细研究了indy控件的例子,也是同样的错误.不明白他们有BUG还要拿出来示人?我使用的是:IdTCPClient和IdTCPServer.
下面是单独线:unit Unit_MyThread;interfaceuses
  Classes,Sockets,windows,dialogs, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient,SysUtils;type
  MyTCPThread = class(TThread)
 private
    idTCPClient1: TidTCPClient;
    str:string;
  protected
    procedure Execute; override;
  public
    constructor Create(client:TIDtcpclient);
     procedure Terminate;
    Procedure tt();
    Procedure setFlag();
  end;implementation
uses unit2;{ MyTCPThread }constructor MyTCPThread.Create(client:TIDtcpclient);
begin
  inherited Create(false);
  FreeOnTerminate:=true;
  idTCPClient1.Host:=client.Host;end;procedure MytcpThread.Terminate;
begin
  fORM1.ThreadIsExit:=0;
  inherited;
end;procedure MyTCPThread.Execute;
var
  Count: Integer;
  P: PByte;
  s:array [0..255] of char;
begin
     Synchronize (setflag);
  while (not Terminated) and IdTCPClient1.Connected do
  begin
  try
    str:=idTCPClient1.ReadLn();//当关闭主程序时,在这句出现错误,可是,我不知道该如何排除;
    Synchronize (tt);
  except
  showmessage('disconn');
  idTCPClient1.Disconnect;
  break;
  end;
end;
end;procedure MyTCPThread.setflag();
begin
form1.ThreadIsExit:=1;
end;Procedure MyTCPThread.tt();
begin
  Form1.Memo1.Lines.Add(trim(str));
end;end.

解决方案 »

  1.   

    主程序中创建线程如下语句:
    procedure TForm1.IdTCPClient1Connected(Sender: TObject);
    begin
    Thread2:=MyTCPThread.Create(idtcpclient1);
    Thread2.FreeOnTerminate:=true;
    Thread2.Resume;
    end;
      

  2.   

    unit Unit_MyThread;interfaceuses
      Classes,Sockets,windows,dialogs, IdBaseComponent, IdComponent, IdTCPConnection,
      IdTCPClient,SysUtils;type
      MyTCPThread = class(TThread)
     private
        idTCPClient1: TidTCPClient;
        str:string;
      protected
        procedure Execute; override;
      public
        constructor Create(client:TIDtcpclient);
         procedure Terminate;
        Procedure tt();
        Procedure setFlag();
      end;implementation
    uses unit2;{ MyTCPThread }constructor MyTCPThread.Create(client:TIDtcpclient);
    begin
      inherited Create(false);
      FreeOnTerminate:=true;
      idTCPClient1:=client;
    end;procedure MytcpThread.Terminate;
    begin
      fORM1.ThreadIsExit:=0;
      inherited;
    end;procedure MyTCPThread.Execute;
    var
      Count: Integer;
      P: PByte;
      s:array [0..255] of char;
    begin
         Synchronize (setflag);
      while (not Terminated) and IdTCPClient1.Connected do
      begin
      try
        str:=idTCPClient1.ReadLn();//当关闭主程序时,在这句出现错误,可是,我不知道该如何排除;
        Synchronize (tt);
      except
      showmessage('disconn');
      idTCPClient1.Disconnect;
      break;
      end;
    end;
    end;procedure MyTCPThread.setflag();
    begin
    form1.ThreadIsExit:=1;
    end;Procedure MyTCPThread.tt();
    begin
      Form1.Memo1.Lines.Add(trim(str));
    end;end.
      

  3.   

    脱离编译环境呢,你传人的client的的连接服务器的操作在什么地方做的?
      

  4.   

    form的destory事件里加上IdTCPClient1.disconnect试试看
      

  5.   

    单独执行编译好的可执行文件就没问题了,indy的基本功能已经非常稳定了,bug不多。
      

  6.   

    str:=idTCPClient1.ReadLn();//当关闭主程序时,在这句出现错误,可是,我不知道该如何排除;
        Synchronize (tt);
    你这两句改成下面那样:
       try
         str:=idTCPClient1.ReadLn();  
         Synchronize (tt);
       except
         Exit;
       end;改了之后调试时(即用Delphi上的运行时)还会有错,直接执行编译的exe就不再提示出错了.
      

  7.   

    对,你在关闭的时候先IdTCPClient1.disconnect试下.关闭线程用Terminate;不要用free那些.这个的意思是线程允许其他线程通知本线程可以终止.用Free就要出错.