程序如下:
procedure TClientHandleThread.Execute;
var
  UserInfo: TUserInfo;
begin
  while not Terminated do begin
    if not frmAppServer.IdTCPClient1.Connected then
      Terminate
    else
    try
      frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));
//////////////////////////////////////////////////////////////////////////////
    //执行完上句后,程序会去执行IdTCPClient1Disconnected(Sender: TObject);
      所以 sResult='' 请帮忙解决一下,很急!!!
///////////////////////////////////////////////////////////////////////////////      Sleep(50);
      sResult := UserInfo.sResult;
      if sResult <> '' then begin
        Terminate;
        if frmAppServer.IdTCPClient1.Connected then
        try
         frmAppServer.IdTCPClient1.Disconnect;
        except
          //
        end;
      end;
      Application.ProcessMessages;
    except
      on E: Exception do MessageDlg('错误:' + #13 + E.Message, mtError, [mbOk], 0);
    end;
  end;
end;

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/2994/2994314.xml?temp=.7303888
      

  2.   

    谁能解决这个问题,就能解决楼上的问题?
    http://expert.csdn.net/Expert/topic/2994/2994314.xml?temp=.7303888
      

  3.   

    frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));执行完上句后,程序会去执行IdTCPClient1Disconnected(Sender: TObject);我想继续执行下面的语句,不希望执行IdTCPClient1Disconnected(Sender: TObject);
      

  4.   

    既然是阻塞方式,你就让它线程一直在循环中运行就是啊。。
    把frmAppServer.IdTCPClient1.Disconnect;这一句写在循环体外面。。
    另外。。不要在工作线程里面随便加Application.ProcessMessages;TO:solonet(赤岭雄鹰) 
    你的问题不应该还没有解决吧?
    你的情况同这不一样,你的是非阻塞异步选项方式使用SOCKET,是主线程里面处理的。
    细心些多想想吧,我看你贴子的全部回复已经把做法说得很清楚了。。
      

  5.   

    我改成这样:还是不行!procedure TClientHandleThread.Execute;
    var
      UserInfo: TUserInfo;
    begin
      while not Terminated do begin
        if not frmAppServer.IdTCPClient1.Connected then
          Terminate
        else
        try
          frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));
    执行完上句后,程序会去执行IdTCPClient1Disconnected(Sender: TObject);
          Sleep(50);
          sResult := UserInfo.sResult;
        except
          on E: Exception do MessageDlg('错误:' + #13 + E.Message, mtError, [mbOk], 0);
        end;
      end;
      if sResult <> '' then begin
        Terminate;
        if frmAppServer.IdTCPClient1.Connected then
        try
          frmAppServer.IdTCPClient1.Disconnect;
        except
              //
        end;
      end;
    //  Application.ProcessMessages;
    end;
      

  6.   

    TO halfdream(哈欠) 
     frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));
    执行完上句后,程序会去执行IdTCPClient1Disconnected(Sender: TObject);
    并且 出现客户端出现下面异常!
    ‘Connection Closed Gracefully’
      

  7.   

    应该只是流程处理问题吧?你的这句  if sResult <> '' then begin//楼主解释一下这句要判断什么呢?    Terminate;
        if frmAppServer.IdTCPClient1.Connected then
        try
          frmAppServer.IdTCPClient1.Disconnect;
     //为什么在这种情况下你要自己断开SOCKET呢?
        except
              //
        end;
      

  8.   

    我改成这样:还是不行!procedure TClientHandleThread.Execute;
    var
      UserInfo: TUserInfo;
    begin
      while not Terminated do begin
        if not frmAppServer.IdTCPClient1.Connected then
          Terminate
        else
        try
    ///////////////////////////////////////////////////////////////////////// 
         frmAppServer.IdTCPClient1.ReadBuffer(UserInfo, SizeOf(UserInfo));
       这句执行完程序会去执行另外一个过程 
      IdTCPClient1Disconnected(Sender: TObject);//////////////////////////////////////////////////////////////////////////
          Sleep(50);
          sResult := UserInfo.sResult;
        except
          on E: Exception do MessageDlg('错误:' + #13 + E.Message, mtError, [mbOk], 0);
        end;
      end;
    //  if sResult <> '' then begin
    //    Terminate;
    //    if frmAppServer.IdTCPClient1.Connected then
    //    try
    //      frmAppServer.IdTCPClient1.Disconnect;
    //    except
    //          //
    //    end;
    //  end;
    //  Application.ProcessMessages;
    end;
      

  9.   

    哦。你这是SOCKET的客户端程序?
    读完数据后,服务端就断开了连接。。那是它的事。
      

  10.   

    服务器端这样写有错吗?
    procedure THuiTongDDnsService.IdTCPServer1Execute(AThread: TIdPeerThread);
    // IdTCPServer 执行事件
    var
      ActClient, RecClient: PClient;
      UserInfo: TUserInfo;
      ADOQuery1: TADOQuery;
      strSql, strReturn: string;
      RecThread: TIdPeerThread;
      i: integer;
      Log: TextFile;
    begin    with Clients.LockList do
        try
          for i := 0 to Count - 1 do begin
            RecClient := Items[i];
            if RecClient.DNS = UserInfo.LocalName then
            begin
              RecThread := RecClient.Thread;
              UserInfo.sResult := strReturn;
              RecThread.Connection.WriteBuffer(UserInfo, SizeOf(UserInfo), True);
            end;
          end;
        finally
          Clients.UnlockList;
        end; end;end;
      

  11.   

    TO halfdream(哈欠) 
    老大帮帮忙!!1