要解决如下问题。
如果indey的Server控件发出命令客户端如果没有回应的话,那么线程肯定阻塞,有什么办法能让程序跳过继续运行呢?
如一段时间没有响应 就发出“链路不通”的命令,然后退回原来状态,并且在Thread中把这个阻塞的客户端线程给释放。

解决方案 »

  1.   

    异常处理吧,用定时器
    if 在定时器时间范围 then
    begin
    try
      //你的操作
    except
      //关闭连接
    end;
      

  2.   

    我的程序代码如下,看看应该在哪里加些什么代码,是一个发送接受命令给客户端线程的函数:
    function TMainFRM.OperateForCOll(Command: String;
      ResultLength: integer;Index: integer): String;
    var
      strtrans,strcommand,strresult:string;
      i,bufflength:integer;
      buffCommand,buffResult:array[0..1000] of byte;
      List:TList;
    begin
        strtrans:='';
        strcommand := Command;
        strresult := '';
        for i:=1 to  length(strCommand) do
          begin
            if ((copy(strCommand,i,1)>='0') and (copy(StrCommand,i,1)<='9'))or((copy(strCommand,i,1)>='a') and (copy(strCommand,i,1)<='f'))
              or((copy(strCommand,i,1)>='A') and (copy(strCommand,i,1)<='F')) then
            begin
              strTrans:=strTrans+copy(strCommand,i,1);
            end;
          end;
          for i:=0 to (length(strTrans) div 2-1) do
          begin
            buffcommand[i]:=strtoint('$'+copy(strTrans,i*2+1,2));
          end;
          bufflength := (length(strTrans) div 2);
          {向所连接的客户端发送一条命令}
          StatusPanel1.Caption := '正在传送数据,请稍后..';
          //-------------------------------------------------------------------发送接收开始
          try
          List := Idserver.Threads.LockList;      TIdPeerThread(List.Items[Index]).Connection.WriteBuffer(buffcommand,bufflength);
          {将所接收到的16进制命令存放到byte数组}
          TIdPeerThread(List.Items[Index]).Connection.ReadBuffer(buffResult,ResultLength);
          IdServer.Threads.UnlockList;
          except
            on E:Exception do
            begin
              showmessage('传输中出现错误:'+E.Message);
              IdServer.Threads.UnlockList;
              Result:='';
              exit;
            end;
          end;
          {将接收到得数据转化成16进制的字符串}
          //----------------------------------------------------------------发送接收结束
          for i:=0 to ResultLength-1  do
          begin
            strresult := strresult + inttohex(ord(buffResult[i]),2);
          end;    self.StatusPanel1.Caption:= '数据传送完毕';
        Result:=strresult;