TIdTCPClient在线程中调用ReadString时,便一直阻塞在那,这时如果关闭主程序,delphi的IDE就会报出一个错误,如果去掉这个异常?(这个异常用try except是没用的)或者是有没有办法让它退出阻塞状态?

解决方案 »

  1.   

    没有数据的时候ReadString是不会返回的
    在IDE上调试的时候,Try Except默认都会由IDE提示的!
    脱离IDE单独运行才行,或者IDE的选项设置为:由程序管理Exception自己研究一下Delphi的设置选项吧
      

  2.   

    脱离ide,还有timeout设置短一点应该没有问题,太长了在测试阶段没有必要,个人意见
      

  3.   

    建议脱离IDE单独运行。最好是把源码贴出来,才好分析。
      

  4.   

    procedure TReadThread.Execute;
    begin
      inherited;
      repeat
        sRecv := socket.ReadString(1024); //recv
      
        if sRecv <> '' then    
          SendMessage(hMain.............);
      until sRecv = '';
    end;
      

  5.   

    Try Except要加上比较好的说
      

  6.   

    procedure TReadThread.Execute;
    var i:integer;
        s:string;
    begin
       try
       while (Terminated=false) and (IdTCPClient1.Connected=true) do
       begin
          i:=IdTCPClient1.ReadFromStack(); //检查是否需要读取数据
          if i>0 then
          begin
             s:=IdTCPClient1.ReadString(i);//读取数据
          end;
          SleepEx(100,true);
       end; //loop
       except
       end;
    end;
      

  7.   

    zhuangbx220(星)的方法应该可以了:)
      

  8.   

    使用下面的方法脱离IDE运行不会抛出异常了。
    procedure TReadThread.Execute;
    begin
    inherited;
    try
      repeat
        sRecv := socket.ReadString(1024); //recv
        if sRecv <> '' then
        SendMessage(hMain.............);
        until sRecv = '';
    except
      on E:Exception do;
    end;end;
    当然通过设置Tools->Debugger Options->Language Exceptions 的Stop on Delphi Exceptions选项取消在IDE运行也一样。
      

  9.   

    其实之所以出错,是线程不能正常退出的原因。而INDY是阻塞的,服务器端的readln是线程里的代码,又一直停在那里,服务器直接退出的话,线程不能正常退出,所以出错。
    所以,在server的线程里接收,要先判断线程是不是退出或连接是否成功,即
    while not terminate or IdTCPClient.Connected=ture do
    begin
    //接收代码
    end;正常退出的原则是:客户端发退出信号,并退出---服务器接到退出信号,断开连接。当关闭服务器时,可以先发送一个退出命令给客户端,客户端执行上述操作。最后再关闭服务器。