دلفي: لماذا تجعل IDHTTP.ConnectTimeout طلبات أبطأ؟
سؤال
لقد اكتشفت أنه عند تعيين خاصية 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.)