5

DelphiXE2のTSQLConnectionコンポーネントを使用してDataSnapサーバーに接続します。

私の問題は、3秒後に接続できない場合に接続の試行を中止したいのですが、ドライバーのConnectTimeoutプロパティを設定しても影響はないようです(それでも約20秒待ってからあきらめます) 。

私はこれをスレッド内で実行しているので、スレッドにメッセージを投稿できます(スレッドメッセージキューがどのように処理されるかは、このブロッキング呼び出しがどのように作成されたかによって異なります)。スレッドメッセージハンドラーが実行されたとしても、TSQLConnection.Connectedプロパティ(スレッドのExecuteメソッド内で設定される)を設定するための呼び出しのブロックをどのように中断するかがわかりません。

TerminateThreadを呼び出さない方がいいと思います。これはやり過ぎのようであり、(正しく理解していれば)スレッドのスタックに割り当てられたメモリを残すためです。この接続プロセスを中断する方法、または基盤となるIndyコンポーネントにアクセスして、接続タイムアウトを明示的に設定する方法についてのアイデアをいただければ幸いです。

ありがとう!

fConnection := TSQLConnection.Create(nil);
with fConnection do
begin
  DriverName := 'DataSnap';
  Params.Values['CommunicationProtocol'] := 'tcp/ip';
  Params.Values['DatasnapContext'] := 'datasnap/';
  Params.Values['HostName'] := '127.0.0.1';
  Params.Values['Port'] := '211';
  Params.Values['ConnectTimeout'] := '3000';
  KeepConnection := true;
  LoginPrompt := true;
end;

// Where it blocks for up to 20 seconds (if host unavailable)
fConnection.Connected := True;
4

1 に答える 1

1

私はこれについて考えます.ConnectTimeoutが機能しない場合は、別の方法でこれを解決できます

最初に接続する前に、たとえばIndyコンポーネント(これがローカルホストでない場合;-))で宛先ホストにpingを実行するか、telnetサービスポート(これもIndyによる)を試してください-これが、殺さずに今何ができるかを考える最も簡単な方法だと思いますスレッド

于 2014-05-25T19:02:54.190 に答える