TIdCmdTCPClient锁死 ( 积分: 100 )

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

caigou

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi2005自带的Indy中的TIdCmdTCPClient控件,在程序中调用Disconnect方法后就被锁死了,请问高手这是为什么呀?
 
delphi2005自带的Indy中的TIdCmdTCPClient控件,在程序中调用Disconnect方法后就被锁死了,请问高手这是为什么呀?
 
用那个idfreeze什么的控件不能解决嘛?
随便拖拽一个到窗口上就好了~


------------------------------------
我是新手啊~~不管用别贬我啊~
 
AntiFreeze是不管用的。因为TIdCmdTCPClient控件内部有一个Listening线程,负责接收从服务器发过来的信息。这个线程创建的时候FreeOnTerminate被设置了False,而在Disconnect过程中,是先要结束掉线程,代码如下:
if Assigned(FListeningThread) then begin
with FListeningThread do begin
Terminate;
WaitFor;
end;
end;
//
FreeAndNil(FListeningThread);
inherited;
//
if Assigned(FOnDisconnect) then begin
OnDisconnect(Self);
end;
问题出在哪里呢?就是那个WaitFor,那个WairFor调用的是msgWaitForMultiObject系统方法。因为Listening线程在Run中调用的是TIdCmdTCPClient.IOHandler.ReadLn,这个方法是以阻塞方式调用的Sock接收方法,调用后,如果缓冲区没有数据进入,就一直被阻塞在那儿了,线程的循环没有继续,所以即使设置了线程的Terminate属性,Execute方法仍然没有办法去检查这个属性并结束线程。所以才用了WaitFor,但是奇怪的是WaitFor不为什么无限等待,而程序失去响应呢?怎么样才能让线程正常结束呢?
 
后退
顶部