2010-07-23 11 views
7

He creado una aplicación de monitoreo de sitio web simple usando el componente Indy TIdhttp. Deseo detectar cuando una página designada no se devuelve dentro de un marco de tiempo especificado (estoy usando 5000 milisegundos). Como prueba, creé una página en un sitio web que intencionalmente toma 15 segundos para responder. Pero no puedo hacer que mi procedimiento "abandone" después de los 5 segundos. He tratado ReadTimeout, un suggested solution utilizando un contador de tiempo y el evento OnWorkBegin (nunca fue capaz de conseguir OnWorkBegin para disparar inmediatamente después de la llamada GET).¿Hay alguna manera de establecer el tiempo de espera de respuesta para Indy Tidhttp?

Nota No me preocupa el tiempo de espera de una conexión. Mi preocupación aquí es un tiempo de espera para que el servidor regrese con una página.

Aquí hay un código fuente que he estado usando. Contiene muchos de los elementos a los que hago referencia.

procedure TServLogic.WorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Int64); 
begin 
    GetTimer.Enabled := True; 
end; 
procedure TServLogic.WorkEnd(ASender: TObject; AWorkMode: TWorkMode); 
begin 
    GetTimer.Enabled := False; 
end; 

procedure TServLogic.GetTimerTimer(Sender: TObject); 
begin 
    idHttp.Disconnect(True); 
end; 

procedure TServLogic.CallHttp(mlink: String): String; 
begin 
    result := ''; 
    GetTimer := TTimer.create(nil); 
    GetTimer.OnTimer := GetTimerTimer; 
    GetTimer.Interval := 5000; 
    try 
    IdHTTP := TIdHTTP.create(nil); 
    idhttp.ReadTimeout := 5000; 
    IdHttp.OnWorkBegin := WorkBegin; 
    IdHttp.OnWorkEnd := WorkEnd; 
    try 
     result := idhttp.get(mLink); 
    except 
     on e:exception do begin 
     AppendToLog('Server did not respond withing 5 seconds'); 
     end; 
    end; 
    finally 
    GetTimer.Free; 
    idhttp.free; 
    end; 
end; 
+0

Ver también: [La conexión no se desconecta mientras se usa Indy] (http://stackoverflow.com/questions/3187446/the-connection-does-not-timeout-while-using-indy). –

+2

Su lógica con TTimer espera TIdHTTP asíncrono que no es verdadero –

+0

Estudió el artículo sugerido por Rob Kennedy. He creado una solución de tipo roscado. Creé una TStringList en la aplicación principal para administrar mis hilos. También tengo un temporizador que dispara cada 5 segundos. Entonces, si veo un hilo que no ha "terminado" en 5 segundos, llamo al método Terminate del hilo. Pero esto no parece "Terminar" inmediatamente de la manera que quiero; todavía parece esperar. –

Respuesta

2

Finalmente obtuve la respuesta en base a los comentarios de Rob Kennedy. Intenté en numerosas ocasiones contactarlo y pedirle que hiciera una respuesta "formal" para poder darle el voto. Nunca escuché de nuevo.

Cuestiones relacionadas