2012-08-29 13 views
5

Utilizzo del componente TSQLConnection in Delphi XE2 per connettersi a un server DataSnap.Come interrompere un tentativo di connessione TSQLConnection in XE2?

Il mio problema è che vorrei interrompere il tentativo di connessione se non siamo in grado di connettersi dopo 3 secondi, tuttavia l'impostazione della proprietà ConnectTimeout del driver non sembra avere alcun impatto (attende ancora circa 20 secondi prima di arrendersi).

Sto eseguendo questo all'interno di un thread e quindi potrei inviare un messaggio al thread (come se la coda dei messaggi di thread è gestita dipende, suppongo, da come è stata creata questa chiamata di blocco). Anche se il mio gestore di messaggi thread è in esecuzione, non sono sicuro di come interrompo il blocco della chiamata per impostare la proprietà TSQLConnection.Connected (che è impostata nel metodo Execute del thread).

Preferisco non chiamare TerminateThread in quanto sembra eccessivo e lascerebbe (se ho capito correttamente) la memoria allocata allo stack del thread. Qualsiasi idea su come interrompere questo processo di connessione, o accedere ai componenti di Indy sottostanti e impostare esplicitamente il timeout della connessione, sarebbe apprezzata.

Grazie!

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; 

risposta

1

penso a questo e se ConnectTimeout non funziona, allora si può risolvere questo in un altro modo

prima di collegare cercare di ping host dest per componente esempio Indy (se questo non è il localhost; -)) o meglio provare la porta di servizio telnet (anche da Indy) - Suppongo che questo sia il modo più semplice per pensare a cosa puoi fare ora senza uccidere il thread

+0

Il problema con questo è che il firewall dovrebbe consentire ICMP. Mi rendo conto che l'esempio mostra una connessione a localhost ma non penso che l'uso di un protocollo separato sia la soluzione in questo caso. Fammi sapere se ho frainteso. – Duncan

Problemi correlati