2010-07-23 10 views
7

Ich habe eine einfache Website-Monitoring-Anwendung mit Indy TIdhttp-Komponente gebaut. Ich möchte feststellen, wenn eine bestimmte Seite nicht innerhalb eines bestimmten Zeitraums zurückgegeben wird (ich verwende 5000 Millisekunden). Als Test habe ich eine Seite auf einer Website erstellt, die absichtlich 15 Sekunden für die Antwort benötigt. Aber ich kann meine Prozedur nicht dazu bringen, nach den 5 Sekunden aufzugeben. Ich habe versucht, Readtimeout, ein suggested solution mit Hilfe einer Zeitschaltuhr und die OnWorkBegin Ereignis (war nie in der Lage OnWorkBegin zu erhalten unmittelbar nach dem Anruf erhalten zu feuern).Gibt es eine Möglichkeit, Antwort-Timeout für Indy Tidhttp wird gesetzt?

Hinweis Ich bin nicht besorgt über eine Verbindung Zeitüberschreitung. Meine Sorge hier ist eine Zeitüberschreitung für den Server, um mit einer Seite zurückzukehren.

Hier ist ein Quellcode, den ich benutzt habe. Es enthält viele der Elemente, die ich referenziere.

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

Siehe auch: [Die Verbindung Timeout nicht während der Verwendung von Indy] (http://stackoverflow.com/questions/3187446/the-connection-does-not-timeout-while-using-indy). –

+2

Ihre Logik mit TTimer erwartet asynchrone TIdHTTP, die nicht wahr –

+0

Blick auf den Artikel von Rob Kennedy vorgeschlagen. Ich habe eine Lösung vom Threadtyp erstellt. Erstellt eine TStringList in der Hauptanwendung, um meine Threads zu verwalten. Ich habe auch einen Timer, der alle 5 Sekunden feuert. Wenn ich also einen Thread sehe, der nicht innerhalb von 5 Sekunden "beendet" hat, rufe ich die Terminate-Methode des Threads auf. Aber das scheint es nicht so zu "beenden", wie ich es will; es scheint immer noch zu warten. –

Antwort

2

Ich bekam schließlich die Antwort auf die Kommentare von Rob Kennedy. Ich habe mehrmals versucht, ihn zu kontaktieren und um eine formelle Antwort zu bitten, damit ich ihm die Stimme geben konnte. Nie wieder gehört.