0

Indy 9 コンポーネントを使用して外部デバイスとの永続的な IdTCPConnection を維持する Delphi 6 アプリケーションがあります。接続を切断してからデバイスに再接続したい場合があります。私が行ったときに、Indy が最大 3 つの個別の例外をスローすることがわかりました。これは、Indy コンポーネントがバックグラウンド スレッド上にあり、スレッドの Execute() ループを中断したくないため、クリーンな再接続戦略の開発をやや面倒にしています。

再接続を試みる前に 3 つの例外を吸収する適切な、またはクリーンな方法は何ですか? 私が確認した 3 つの例外は、出現順に、EIdClosedSocket、EIdConnClosedGracefully、EIdSocketError (LastError = WSAECONNABORTED) です。再接続を試行する前に、ソケットのクローズに関連するすべての例外が伝播するまで待ちたいのですが、それを行うためのコード ループを構築する方法がわかりません。

4

1 に答える 1

2

一度にスレッドのコードに到達する例外は 1 つだけです。スレッド ループ内のコードをtry/exceptブロックでラップし、次のループ反復で再接続するだけです。

while not Terminated do
begin
  if not Client.Connected then
  try
    Client.Connect;
  except
    Sleep(2500);
    Continue;
  end;
  try
    // communicate with device as needed...
  except
    on E: EIdException do
    begin
      // Indy socket error, reconnect
      Client.Disconnect;
      Client.InputBuffer.Clear;
    end;
    on E: Exception do
    begin
      // something else happened in your code...
    end;
  end;
end;
于 2012-06-14T16:08:27.083 に答える