2012-08-29 8 views
5

Używanie komponentu TSQLConnection w Delphi XE2 do łączenia się z serwerem DataSnap.Jak przerwać próbę połączenia TSQLConnection w XE2?

Mój problem polega na tym, że chciałbym przerwać próbę połączenia, jeśli nie uda nam się połączyć po 3 sekundach, jednak ustawienie właściwości ConnectTimeout sterownika nie wydaje się mieć żadnego wpływu (nadal czeka około 20 sekund przed poddaniem się).

Używam tego wewnątrz wątku, więc mogę wysłać wiadomość do wątku (to, w jaki sposób kolejka komunikatów wątków jest obsługiwana, zależy, jak przypuszczam, od tego, w jaki sposób zostało wywołane wywołanie blokujące). Nawet jeśli uruchomił się mój program obsługi komunikatów wątku, nie jestem pewien, jak przerwać blokowanie wywołania, aby ustawić właściwość TSQLConnection.Connected (która jest ustawiona w metodzie Execute wątku).

Wolałbym nie wywoływać TerminateThread, ponieważ wydaje się to przesadą i zostawi (jeśli dobrze rozumiem) pamięć przydzieloną do stosu wątku. Wszelkie pomysły na przerwanie tego procesu połączenia lub dostęp do podstawowych komponentów Indy i jawne ustawienie limitu czasu połączenia zostaną docenione.

Dzięki!

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; 

Odpowiedz

1

myślę o tym a jeśli ConnectTimeout nie poskutkuje, to można to rozwiązać w inny sposób

pierwszy przed podłączeniem spróbować hosta ping dest przez komponent np Indy (jeśli nie jest to localhost; -)) lub lepiej wypróbuj port telnetowy (również Indy) - przypuszczam, że jest to najprostszy pomysł, co możesz teraz zrobić bez zabicia tego wątku.

+0

Problem polega na tym, że zapora będzie musiała zezwolić na ICMP. Zdaję sobie sprawę, że przykład pokazuje połączenie z localhost, ale nie sądzę, że używanie oddzielnego protokołu jest poprawką w tym przypadku. Daj mi znać, jeśli źle to zrozumiałem. – Duncan