IDTcpClient线程接收的问题(90分)

  • 主题发起人 主题发起人 tswhq
  • 开始时间 开始时间
T

tswhq

Unregistered / Unconfirmed
GUEST, unregistred user!
...
TReadThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
Public
constructor Create(Suspended:Boolean);
end;
...
var
Form1 :TForm1;
User :Users;
ChatBuffer :ChatBuffers;
ReadThread :TReadThread;
...
procedure TForm1.ClientConnected(Sender: TObject);
begin
Memo.Lines.Add(TimeToStr(Time)+' 登录成功!');
ReadThread:=TReadThread.Create(False);
end;

//**********************************************************
//
// 线程部分
//
//**********************************************************
constructor TReadThread.Create(Suspended: Boolean);
begin
inherited Create(Suspended);
end;

procedure TReadThread.Execute;
var
F:ConnectMark;
begin
while Form1.Client.Connected do
begin
Form1.Client.ReadBuffer(F,SizeOf(F));
case F of
Chat:
begin
Form1.Client.ReadBuffer(ChatBuffer.Buffer,SizeOf(ChatBuffer.Buffer));
Form1.Memo.Lines.Add(ChatBuffer.Buffer);
end;
end;
Sleep(300);
end;
end;
程序在编译器里调试运行时功能正常,但过大约10秒后抱错'read timeout',
直接运行EXE文件时功能正常,但过大约10秒后抱错'connection closed garcefully'
 
顺便说。。/不要直接读。。

先判断indy TcpClient的buf里面有没有数据。也要在sleep()范围内。
 
.CurrentReadBuffer

用这个读。。。然后再转你需要的buf格式。。。

直接用recvBuffer很难控制哦。。
 
顺便说。。/不要直接读。。

先判断indy TcpClient的buf里面有没有数据。也要在sleep()范围内。

怎么判断 TcpClient的buf里面有没有数据?
 
Form1.Memo.Lines.Add(ChatBuffer.Buffer);
TIdPeerThread继承自TThread 看看TThread VCL不支持线程 所以onExecute不要出现界面显示。如果需要最好用同步函数。
 
还有没有新的提示?要不就结帖了(180分)
 
俺帮不上忙啊
 
{顺便说。。/不要直接读。。

先判断indy TcpClient的buf里面有没有数据。也要在sleep()范围内。

怎么判断 TcpClient的buf里面有没有数据? }

用CurrentReadBufferSize来判断。
 
to wxjourspace
怎样用CurrentReadBufferSize呀?
IDTcpClient.CurrentReadBufferSize 没有该属性呀????
 
Sleep(300); 根本不需要 indy 用的是堵塞模式没有数据自己就停在那里 不需要用 Sleep(300); 可能是接收数据因此超时
 
Sleep(300);不需要
 
多人接受答案了。
 
后退
顶部