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;
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). –
Su lógica con TTimer espera TIdHTTP asíncrono que no es verdadero –
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. –