2012-08-29 10 views
5

Delphi XE2のTSQLConnectionコンポーネントを使用してDataSnapサーバーに接続します。XE2でTSQLConnectionの接続を中止する方法はありますか?

私の問題は、3秒後に接続できない場合は接続の試行を中断したいが、ドライバのConnectTimeoutプロパティを設定しても影響はないようだ(約20秒間あきらめる前に)。

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

私は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; 

答えて

1

私はこの 考えるとのconnecttimeoutが、その後動作しない場合は、別の方法でこれを解決することができ

最初の前に、これはローカルホストでない場合(例えば、インディコンポーネントによってピングDESTホストにしようと接続し; - )) またはそれ以上telnetサービスポートを試してみてください - これは最も簡単だと思います。スレッドを強制終了せずに今できることを考えてください。

+0

この問題は、ファイアウォールがICMPを許可する必要があるということです。この例ではlocalhostへの接続を示していますが、別のプロトコルを使用しているとは思われません。私が誤解しているかどうか知らせてください。 – Duncan

関連する問題