使用INDY控件产生的问题(17分)

  • 主题发起人 主题发起人 cb1997
  • 开始时间 开始时间
C

cb1997

Unregistered / Unconfirmed
GUEST, unregistred user!
INDY控件:
多个TIdTCPClient端和TIdTCPServer连接时,TIdTCPServer的IdTCPSExecute事件产生的问题
....
CltThrdList: TThreadList;
......
procedure TfrmMain.IdTCPSExecute(AThread: TIdPeerThread);
var
。。。
aFileName:string;
。。。
begin
.........
with CltThrdList.LockListdo
try
......
for i := 0 to count - 1do
begin
.......
aFileName := RecThread.Connection.ReadLn;
........
end;
finally
CltThrdList.UnlockList;
end;
........
end;

当某个客户t端没有向服务器端写数据时,程序在 aFileName := RecThread.Connection.ReadLn;
这句就没有响应了,这个问题如何解决呀?
 
设置readtimeout啊,产生异常之后可以逃出来
 
楼上的兄弟:
这样不行呀!我将
if RecThread.Connection.ReadTimeout = 6000 then
continue;
无论放在aFileName := RecThread.Connection.ReadLn;
前面还是后面还是出现老问题
 
begin
.........
with CltThrdList.LockListdo
try
RecThread.Connection.ReadTimeout = 6000;
......
for i := 0 to count - 1do
begin
.......
aFileName := RecThread.Connection.ReadLn;
........
end;
finally
CltThrdList.UnlockList;
end;
........
end;

 
两为兄弟:
还是不行,现在的问题是
for i := 0 to count - 1do
begin
.......
aFileName := RecThread.Connection.ReadLn;
........
end;
进行这个循环的时候,某个客户端可能没有发送writeln命令,这时RecThread.Connection.ReadLn的值就是空,将空赋给aFileName 。。。。我觉得该是这个问题
不该是ReadTimeout的问题!
 
楼主,不要用 for
indy的那个 onexecute 事件发生时,就是多线程了
另外一定要用线程池,否则效率不会高
 
yanyandt2兄
我现在是多个C,一个S,用线程池的话我在S中如何区分是哪个C发出来的数据呢?
 
楼主,当然是多个 c,一个 s
如何区分?好象有个 threadid ,或者别的 thread 什么的
你先看看 indy 的例子,把基本的弄明白,然后再动手做
当客户端和服务器响应时,s 就会启动一个 thread,会产生 onexecute
你不用去弄什么 for
 
后退
顶部