1

在 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;

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

4

1 回答 1

5

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

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块中。

于 2012-09-20T17:18:39.220 回答