2012-08-29 9 views
5

Verwenden der TSQLConnection-Komponente in Delphi XE2 zum Herstellen einer Verbindung mit einem DataSnap-Server.Wie wird ein TSQLConnection-Verbindungsversuch in XE2 abgebrochen?

Mein Problem ist, dass ich den Verbindungsversuch abbrechen möchte, wenn wir nach 3 Sekunden keine Verbindung herstellen können, jedoch scheint die Einstellung der ConnectTimeout-Eigenschaft des Treibers keine Auswirkungen zu haben (es wartet immer noch 20 Sekunden) bevor Sie aufgeben).

Ich führe dies innerhalb eines Threads und so konnte ich eine Nachricht an den Thread (wie ob die Thread-Nachrichtenwarteschlange bedient hängt davon ab, wie dieser Blockieranruf erstellt wurde). Selbst wenn mein Thread-Nachrichtenhandler ausgeführt wird, bin ich mir nicht sicher, wie ich dann den Aufruf blockieren würde, um die TSQLConnection.Connected-Eigenschaft (die in der Execute-Methode des Threads festgelegt ist) zu blockieren.

Ich würde nicht TerminateThread anrufen, da dies Overkill scheint und würde (wenn ich richtig verstehe) den Speicher den Thread Stack zugeordnet. Irgendwelche Ideen, wie man diesen Verbindungsprozeß unterbricht oder auf die zugrundeliegenden Indy-Komponenten zugreift und das Verbindungszeitlimit explizit dort einstellt, würden geschätzt werden.

Danke!

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; 

Antwort

1

denke ich über diese und wenn Connect nicht arbeiten dann können Sie dies versuchen, ping dest Host von zB Indy Komponente (wenn dies nicht der localhost verbinden

, bevor auf eine andere Weise lösen; -)) oder besser versuchen Telnet-Service-Port (auch von Indy) - ich nehme an, dass dies die einfachste ist, was Sie jetzt tun können, ohne den Thread zu töten

+0

Das Problem dabei ist, dass die Firewall ICMP zulassen müsste. Ich weiß, das Beispiel zeigt eine Verbindung zu localhost, aber ich denke nicht, dass die Verwendung eines separaten Protokolls die Lösung in diesem Fall ist. Lass es mich wissen, wenn ich es falsch verstanden habe. – Duncan