while Form1.TCPClient.Connected and not ReadThread.Terminated do
  begin
    c:=Form1.TCPClient.ReadFromStack(True,-2,True);
    if c<1 then Continue;
    try
      Form1.TcpClient.ReadBuffer(F,SizeOf(F));
      Form1.TcpClient.ReadBuffer(Verify,SizeOf(Verify));
      ....
    except
      Synchronize(DisplayError);//由于没有得到数据,每次都显示"线程执行错误!!!"
    end;
  end
...
procedure TReadThread.DisplayError;
begin
  Form1.StatusBar.Panels.Items[2].Text:='线程执行错误!!!';
end;ReadFromStack 为何也报read timeout?  

解决方案 »

  1.   

    什么样的Delphi?
    我这儿的TCPClient没ReadFromStack方法
      

  2.   

    你要先判断它是否是连接的啊
      FreeOnTerminate := True;  while ((not Terminated) and DM.tcpLog.Connected) do
      begin
        ires := DM.tcpLog.ReadFromStack;
        if ires > 0 then
        begin
          DM.tcpLog.ReadBuffer(recMsg,sizeof(recMsg));
      

  3.   

    delphi 7.0
    Indy 9.00.10
      

  4.   

    其实你这个接收有问题:
          Form1.TcpClient.ReadBuffer(F,SizeOf(F));
          Form1.TcpClient.ReadBuffer(Verify,SizeOf(Verify));
    因为你上面有ReadFromStack,到系统会把每次接收的信息都执行到Form1.TcpClient.ReadBuffer(F,SizeOf(F)); 里面,而下面那一句Form1.TcpClient.ReadBuffer(Verify,SizeOf(Verify));是接收不到数据的
      

  5.   

    to 楼上的procedure TIdTCPConnection.ReadBuffer(var ABuffer; const AByteCount: Integer);
    begin
      if (AByteCount > 0) and (@ABuffer <> nil) then begin
        // Read from stack until we have enough data
        while (InputBuffer.Size < AByteCount) do begin
          ReadFromStack;
          CheckForDisconnect(True, True);
        end;
        // Copy it to the callers buffer
        Move(InputBuffer.Memory^, ABuffer,AByteCount);//此处说明返回你指定的字节数
        // Remove used data from buffer
        InputBuffer.Remove(AByteCount);
      end;
    end;系统会把每次接收的信息都执行到Form1.TcpClient.ReadBuffer(F,SizeOf(F)); 里面,而下面那一句Form1.TcpClient.ReadBuffer(Verify,SizeOf(Verify));是接收不到数据的          ----我不这样认为!   
      

  6.   

    呵呵,我不是这个意思
      while ((not Terminated) and DM.tcpLog.Connected) do
      begin
        ires := DM.tcpLog.ReadFromStack;
        if ires > 0 then
        begin
          DM.tcpLog.ReadBuffer(recMsg,sizeof(recMsg));
          Form1.TcpClient.ReadBuffer(Verify,SizeOf(Verify));
        end;
      end
    这个是循环接收的,结果应该是都会被DM.tcpLog.ReadBuffer(recMsg,sizeof(recMsg));
    这一句接收到,第二句接收可能接收不到而两个record的结构类型不同的话,就会报错
      

  7.   

    我的程序是可以使用的,在delphi 7 下运行时,每当idtcpclient.timeout到时后,编译运行器报错"Read timeout",按F9后能正常运行;在正常运行时,提示"线程执行错误!!!"我的问题是要怎样解决"Read TimeOut"问题
      

  8.   

    ReadFromStack 为何也报read timeout?
    是在 ReadFromStack 的时候出错的吗?
    1 试试把参数去掉看看还报错不
    2 如果还报错的话,可能就是你服务器端第一次发送后,对该客户的连接线程出了问题,坚持一下服务器端代码