Frage

Ich entdeckte, dass, wenn die ConnectTimeoout Eigenschaft für eine Komponente TIdHTTP Einstellung, es die Anforderungen macht (GET und POST) langsamer über 120 ms werden?

Warum ist das und kann ich vermeiden / Bypass dieses irgendwie?

Env: D2010 mit ausgeliefert Indy Komponenten, installiert alle Updates für D2010. OS ist WinXP (32 Bit) SP3 mit den meisten Patches ...

Meine Zeit Routine ist:

    Procedure DoGet;
    Var
       Freq,T1,T2 : Int64;
       Cli        : TIdHTTP;
       S          : String;
    begin
         QueryPerformanceFrequency(Freq);
         Try
            QueryPerformanceCounter(T1);
            Cli := TIdHTTP.Create( NIL );
            Cli.ConnectTimeout := 1000;  // without this we get < 15ms!!
            S := Cli.Get('http://127.0.0.1/empty_page.php');
         Finally
            FreeAndNil(Cli);
            QueryPerformanceCounter(T2);
         End;
         Memo1.Lines.Add('Time = '+FormatFloat('0.000',(T2-T1)/Freq) );
    End;

Mit dem Connect Set in Code I avg bekommen. Zeiten von 130-140ms, ohne das sie über die 5-15ms ...

War es hilfreich?

Lösung

Wenn ConnectTimeout Null (und TIdAntifreeze nicht wirksam ist), Indy verbindet einfach. Andernfalls TIdIOHandlerStack.ConnectClient ruft DoConnectTimeout, die erstellt einen neuen Thread die Verbindungs ??während zu tun, der rufende Thread schläft und Prozesse TIdAntifreeze Operationen, warten auf die Verbindung aufgebaut werden. Wenn es eine Verbindung nicht durch die Zeit, eine Ausnahme der Timeout abgelaufen ist, wirft es.

Themen sind nicht frei, und der anrufende Thread wird immer schlafen, bevor geprüft wird, ob die Verbindung Thread seine Aufgabe erfüllt hat. Die Standard-Schlafdauer ist 125 ms . (Gebrauch etwas anderes, aktivieren TIdAntifreeze und legen Sie seine IdleTimeout Eigenschaft als 125 senken.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top