终止线程并断开indy客户端

时间:2012-09-20 07:13:36

标签: delphi indy10

在Delphi中,我有一个线程客户端,用于侦听线程中的响应。 线程声明如下:

TMyThread = class(TThread)
  private
    FClient: TIdTCPClient;
    FStringResponse: string;
  protected
    procedure Execute; override;
    procedure DoSynch;
  public
    constructor Create(AClient: TIdTCPClient);
  end;

我使用:

连接
  if not IdTCPClient1.Connected then
  begin
    // // Set the Host
    IdTCPClient1.Host := Edit1.Text;
    // // Set the port
    IdTCPClient1.Port := 65535;
    // // Connect
    IdTCPClient1.Connect;
    try
      MyThread := TMyThread.Create(IdTCPClient1);
    except
      IdTCPClient1.Disconnect;
      raise;
    end;
  end;

我尝试断开使用:

if MyThread <> nil then
  begin
    MyThread.Terminate;
    // MyThread.WaitFor;
    MyThread.Free;
    MyThread := nil;
    IdTCPClient1.Disconnect;
end;

但是这个断开连接代码会引发异常。什么是终止此线程和断开客户端的正确方法?

1 个答案:

答案 0 :(得分:4)

尝试颠倒关机操作的顺序 - 在释放线程之前断开客户端,而不是相反。这样,线程内的任何阻塞套接字操作都会被中止,允许线程对终止做出反应:

if MyThread <> nil then
  MyThread.Terminate; 
try
  IdTCPClient1.Disconnect; 
finally
  if MyThread <> nil then
  begin
    MyThread.WaitFor; 
    MyThread.Free; 
    MyThread := nil; 
  end;
end; 

如果您仍然从Disconnect()获得异常,请确保该线程没有断开客户端,只读取/写入它,并将Disconnect()包装在自己的try/except中如果需要阻止。