首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

怎么结束TIdTCPClient的接收数据线程

2013-08-14 
如何结束TIdTCPClient的接收数据线程?本帖最后由 tjs_125 于 2013-08-02 12:50:04 编辑我使用TIdTCPClient

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

热点排行