如何结束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;
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;