如何结束TIdTCPClient的接收数据线程?
本帖最后由 tjs_125 于 2013-08-02 12:50:04 编辑 我使用TIdTCPClient编写客户端数据收发程序,其中数据接收是利用线程来读取的,线程里面读取数据是用FTcpClient.ReadLn函数,代码如下:
procedure TReceiveMsgThread.Execute;
begin
inherited;
try
while (not Terminated) and (FTcpClient.Connected) do
begin
try
if FTcpClient.IOHandler.Readable(1) then
begin
revData := FTcpClient.ReadLn( FDataEndStr);
Synchronize(HandleRevData);
end;
except
if FTCPClient.Connected then FTCPClient.Disconnect;
Terminate;
end;
end; // while
except
end;
end;
其中FTCPClient线程是在线程创建的构造函数里面赋值的,当没有接收到数据时,ReadLn一直堵塞在哪里,
我现在想结束线程,但一直出错,不知道该如何结束线程。
我是新定义了一个类,里面有个字段FReceiveTh,如下:
TCom_TCP = class(TObject)
//....其他省略
protected
//....其他省略
function HandleRevData(const ARevStr: string): integer;
public
//....
FReceiveTh: TReceiveMsgThread;
FIdTCPClient: TIdTCPClient;
constructor Create; overload;
destructor Destroy; override;
//...
end;
//..........
constructor TCom_TCP.Create;
begin
inherited Create();
FIdTCPClient := TIdTCPClient.Create(nil);
FReceiveTh := TReceiveMsgThread.Create(true, FIdTCPClient); // 创建线程后先挂起
FReceiveTh.FreeOnTerminate := false;
FReceiveTh.FFun_HandleRevData := self.HandleRevData;
FReceiveTh.OnTerminate := RthEndHander;
end;
destructor TCom_TCP.Destroy;
begin
if Assigned(FReceiveTh) then
begin
if CheckThreadFreed(FReceiveTh) = 1 then // 这个函数是用来判定线程是否在工作
begin
FReceiveTh.Suspend; // 挂起线程
FReceiveTh.Terminate; // 结束线程
end;
FreeAndNil(FReceiveTh);
end;
FreeAndNil(FIdTCPClient);
inherited;
end;
现在想结束TCom_TCP对象时,调用TCom_TCP.Free时就卡死了,程序好像进入死循环。
[解决办法]
TCPClient中的接收线程在Terminate时,调试时有个异常,运行时是正常。
调试时的异常一般是在Server和Client之间的Connected=True.