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不为什么无限等待,而程序失去响应呢?怎么样才能让线程正常结束呢?