سؤال

لقد اكتشفت أنه عند تعيين خاصية ConnectTimeOout لمكون TIDHTTP ، فإنه يجعل الطلبات (الحصول على ونشرها) أبطأ حوالي 120 مللي ثانية؟

لماذا هذا ، وهل يمكنني تجنب/تجاوز هذا بطريقة أو بأخرى؟

ENV: D2010 مع مكونات Indy مشحونة ، جميع التحديثات المثبتة لـ D2010. OS هو winxp (32bit) sp3 مع معظم البقع ...

روتين التوقيت الخاص بي هو:

    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;

مع مجموعة ConnectTimeout في الكود أحصل على AVG. أوقات 130-140 مللي ثانية ، بدون حوالي 5-15 مللي ثانية ...

هل كانت مفيدة؟

المحلول

متي ConnectTimeout هو الصفر (و TIdAntifreeze ليس ساري المفعول) ، إندي يربط ببساطة. خلاف ذلك، TIdIOHandlerStack.ConnectClient المكالمات DoConnectTimeout, ، أيّ يخلق موضوعًا جديدًا للقيام بالاتصال أثناء ينام موضوع الاتصال والعمليات TIdAntifreeze العمليات ، في انتظار إنشاء الاتصال. إذا لم يكن هناك اتصال بحلول الوقت الذي تنطلق فيه المهلة ، فإنه يلقي استثناءً.

المواضيع ليست مجانية ، وسوف ينام مؤشر ترابط الاتصال دائمًا قبل التحقق مما إذا كان مؤشر ترابط الاتصال قد أنجز مهمته. مدة النوم الافتراضية هي 125 مللي ثانية. (لاستخدام شيء آخر ، قم بالتنشيط TIdAntifreeze وتعيينها IdleTimeout خاصية أقل من 125.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top