1

In Delphi I have a threaded client that listens for response in a thread. Thread is declared like:

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

I connect using the:

  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;

I try to disconnect using:

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

But this disconnect code throws an exception. What's the proper way to do terminate this thread and to disconnect the client?

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 に答える