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?
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?
我这儿的TCPClient没ReadFromStack方法
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));
Indy 9.00.10
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));是接收不到数据的
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));是接收不到数据的 ----我不这样认为!
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的结构类型不同的话,就会报错
是在 ReadFromStack 的时候出错的吗?
1 试试把参数去掉看看还报错不
2 如果还报错的话,可能就是你服务器端第一次发送后,对该客户的连接线程出了问题,坚持一下服务器端代码