客户端使用idTcpClient的问题,在线等 (100分)

  • 主题发起人 主题发起人 sunshine1750
  • 开始时间 开始时间
S

sunshine1750

Unregistered / Unconfirmed
GUEST, unregistred user!
初次使用Indy,请大家帮我.
客户端要随时响应服务端发过来的数据,是不是也要做一循环不停的read?
这样即使放个idAntiFreeze在窗体上反应也很迟钝,不能满足要求,
这种常用的处理应该有很好的解快方案吧,说个大概就好.
 
做一个接收线程就行了
 
to ghb1974:
线程里面无法处理消息循环,
怎样模拟TTime的OnTimmer事件?
 
Indy组件用的是阻塞方式+多线程,所以客户段只用在Execute中处理Read就可以了,不会影响到主窗体(毕竟在自己的线程中),服务端可以用AThread.Connection发送给客户端的Indy
 
用一个 timer
定时read 就行了
或者用一个线程,不停的 read
 
To yanyandt2:
不用Timer,IndyClient的Execute本身就是一个(线程)While 循环
 
在 Execute 里使用 while 循环?
即使用 idAntiFreeze 效果也不好啊
 
另外
indyclient 也没有 OnExecute
 
是呀,你可以看看Indy自带的Demo,其中就是在Execute中写 While循环的,每次都判断AThread.Terminted。
 
to qince:
客户端的连接线程A就是主线程吧?
基于indy的阻塞特性,所以只有另开一线程B来做这个操作,
但是在线程B当中怎样才能做到不停的Read?TTime是不行的

哪个Demo?昏,我用的是D7,还得去找D6的Demo
 
谁说 timer 不行啊
试过再说
另外,indy那个demo 在 Execute 中的部分,是服务器端,不是客户端
 
客户端的连接不是主线程,以下是Indy的Demo,请参考
// 定义Client线程
TClientHandleThread = class(TThread)
private
CB: TCommBlock; // 传输协议
procedure HandleInput; // 和主线程通讯
protected
procedure Execute; override;
end;
// Execute函数
procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not ClientFrmMain.Client.Connected then
Terminate
else
try
ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
Synchronize(HandleInput);
except
end;
end;
end;
 
to yanyandt2:
我试过Time,确实响应不过来
 
To yanyandt2:
没有人说Timer不行,可是Timer是依靠Windows的消息循环,而网络传输如果依靠WM_TIMER的消息时性能肯定不行,所以还是用While循环,在While中自己写线程的挂起和激活,这样就可以在性能和资源上做一个平衡。
 
to qince:
好,我试试,
只要idTcpClient另开了一个线程,就有法子
 
To sunshine1750
用D7也没关系,可以在Indy的主页上Download一个他的Demo,最新的Demo是For Indy8的,不过哪个版本的Demo都可以参考,架构大致相同,只是有的函数没有。
 
是啊

来自:yanyandt2, 时间:2003-12-14 12:31:00, ID:2352878 | 编辑
用一个 timer
定时read 就行了
或者用一个线程,不停的 read

如果系统不是很忙,用 timer 可以
或者用一个线程,不停的 read

那不就是上面的那个意思么。
如果你说用 timer 不行,那就是你用错了,看 indy demo,有个
聊天的,就是用 timer,虽然效率不高。
 
我装的是 indy 9
indy10 虽然有了,因为是 beta版,所以没用。

我觉得indy还是不错的,因为一直没有教程(那几个demo
远远不够),所以好象没人能真正发挥它的极限能力。
这个是最郁闷的
 
To yanyandt2:
Indy9写得不错,很少的Bug,功能不错(可以看他的 Source code),但是作者用多线程+阻塞模式受到很多人的抨击,不过如果是一个小服务应用还是可以用Indy的,如果是很大的应用,最好还是自己写Socket,性能和Bug都会上一个档次,就是太费事了。
 
不知道 indy10 效果如何。
不过 “如果是一个小服务应用还是可以用Indy的,如果是很大的应用,最好还是自己写Socket”这个评论好象没什么确实的证据
 
后退
顶部