2012-08-29 23 views
5

Usando el componente TSQLConnection en Delphi XE2 para conectar a un servidor DataSnap.Cómo anular un intento de conexión TSQLConnection en XE2?

Mi problema es que me gustaría abortar el intento de conexión si no nos podemos conectar después de 3 segundos, sin embargo, configurar la propiedad ConnectTimeout del controlador no parece tener ningún impacto (todavía espera alrededor de 20 segundos) antes de rendirse).

Estoy ejecutando esto dentro de un hilo y para poder publicar un mensaje en el hilo (supongo que la forma en que se atiende la cola de mensajes de hilo depende de cómo se creó esta llamada de bloqueo). Incluso si mi controlador de mensajes de subproceso se ejecutó, no estoy seguro de cómo interrumpiría el bloqueo de la llamada para establecer la propiedad TSQLConnection.Connected (que está configurada dentro del método Execute del subproceso).

Preferiría no llamar a TerminateThread ya que esto parece excesivo y dejaría (si lo entiendo correctamente) la memoria asignada a la pila del subproceso. Cualquier idea sobre cómo interrumpir este proceso de conexión, o acceder a los componentes subyacentes de Indy y establecer explícitamente el tiempo de espera de conexión allí sería apreciado.

Gracias!

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; 

Respuesta

1

pienso en esto y si ConnectTimeout no funciona, entonces se puede resolver esto de otra manera

primero antes de conectar tratar de ping host dest por componente, por ejemplo Indy (si este no es el localhost; -)) o mejor intente el puerto de servicio de telnet (también por Indy) - supongo que esto es lo más simple que puede hacer sin matar el hilo

+0

El problema es que el firewall debería permitir ICMP. Me doy cuenta de que el ejemplo muestra una conexión con el servidor local, pero no creo que el uso de un protocolo separado sea la solución en este caso. Avísame si he entendido mal. – Duncan

Cuestiones relacionadas