Question

J'ai découvert que lors de la mise la propriété ConnectTimeoout pour un composant TIdHTTP, il fait les demandes (GET et POST) deviennent plus lents sur les 120ms?

Pourquoi est-ce, et puis-je éviter / sautera cette certaine façon?

Env: D2010 avec des composants Indy expédiés, toutes les mises à jour installées pour D2010. OS est Windows XP (32 bits) SP3 avec la plupart des patches ...

Ma routine de synchronisation est:

    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;

Avec l'ensemble ConnectTimeout dans le code que je reçois Avg. temps de 130-140ms, sans elle est à peu près 5-15ms ...

Était-ce utile?

La solution

Lorsque ConnectTimeout est égal à zéro (et TIdAntifreeze est pas en vigueur), Indy se connecte simplement. Dans le cas contraire, TIdIOHandlerStack.ConnectClient appelle DoConnectTimeout, qui crée un nouveau thread pour faire la connexion alors que le thread appelant dort et les processus TIdAntifreeze opérations, en attendant que la connexion soit établie. S'il n'y a pas de connexion au moment où le délai d'attente écoulé de, il renvoie une exception.

Fils ne sont pas libres, et le fil appelant sera toujours le sommeil avant de vérifier si le fil de connexion a accompli sa tâche. La durée du sommeil par défaut est 125 ms . (Utiliser quelque chose d'autre, activer TIdAntifreeze et définissez sa propriété IdleTimeout inférieure à 125.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top