Ho creato un'applicazione per il monitoraggio di siti Web semplice utilizzando il componente Indy TIdhttp. Voglio rilevare quando una pagina designata non viene restituita entro un intervallo di tempo specificato (sto usando 5000 millisecondi). Come test ho creato una pagina su un sito Web che richiede intenzionalmente 15 secondi per rispondere. Ma non riesco a ottenere la mia procedura per "rinunciare" dopo i 5 secondi. Ho provato ReadTimeout, un suggested solution utilizzando un timer e l'evento OnWorkBegin (mai stato in grado di ottenere OnWorkBegin a fuoco subito dopo la chiamata get).C'è un modo per impostare il timeout della risposta per Indy Tidhttp ottiene?
Nota Non sono preoccupato per un timeout della connessione. La mia preoccupazione qui è un timeout per il server per tornare con una pagina.
Ecco un codice sorgente che ho utilizzato. Contiene molti degli elementi di riferimento.
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;
Vedere anche: [La connessione non scade durante l'utilizzo di Indy] (http://stackoverflow.com/questions/3187446/the-connection-does-not-timeout-while-using-indy). –
La logica con TTimer prevede TIdHTTP asincrono che non è vero –
Ha esaminato l'articolo suggerito da Rob Kennedy. Ho creato una soluzione di tipo threaded. Crea una TStringList nell'applicazione principale per gestire i miei thread. Ho anche un timer che scatta ogni 5 secondi. Quindi, se vedo un thread che non è "finito" in 5 secondi, chiamo il metodo Terminate del thread. Ma questo non sembra "Terminare" immediatamente nel modo in cui voglio; sembra ancora aspettare. –