2010-07-23 10 views
7

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; 
+0

Vedere anche: [La connessione non scade durante l'utilizzo di Indy] (http://stackoverflow.com/questions/3187446/the-connection-does-not-timeout-while-using-indy). –

+2

La logica con TTimer prevede TIdHTTP asincrono che non è vero –

+0

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. –

risposta

2

alla fine ho avuto la risposta sulla base dei commenti di Rob Kennedy. Ho provato più volte a contattarlo e gli chiedo di fare una risposta "formale" in modo da potergli dare il voto. Mai sentito indietro.

Problemi correlati