كيفية تغيير أولوية موضوع المستمع
-
09-09-2019 - |
سؤال
يمكنني استخدام مكون TIDCMDTCPSERVER الخاص من Indy 10 لتحقيق تطبيق خادم العميل الخاص بي. المشكلة هي أن طلب العملاء يمكن أن يكون معقدا إلى حد ما وأن جزء واجهة المستخدم الرسومية من تطبيق الخادم الخاص بي يفقد على الفور الاستجابة. من وثائق إندي, ، حصلت على هذا إندي:
ينشئ ويبدأ مؤشرات الترابط للمستمع في الروابط باستخدام TPHTHEST Proled Proled.
هل يمكنني تغيير هذا السلوك؟
المحلول
كما أشار روب، لا تغير أولوية موضوع المستمع، وخفض أولوية مؤشرات ترابط العمال بدلا من ذلك. يمكن الوصول إليها في OnConnect () معالج tidcmdtcpserver. مثيل، مثل ذلك:
procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
// sanity checks need to go here
TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;
نصائح أخرى
تحديد الأولوية أقل لمؤشر ترتيب الاستماع لن يحل مشكلتك. كل مؤشر ترابط المستمع هو الاستماع، وهي ليست مهمة كثيفة المعالجة المركزية. حتى يصل الاتصال، هذا الخيط لا يفعل أي شيء على الإطلاق. قد تتمكن من تأكيد ذلك مع أداة مثل عملية المستكشف العملية؛ أعتقد أنه يمكن أن تظهر استخدام وحدة المعالجة المركزية حسب الخيط.
وضع الأولوية أقل قد تجعل الخادم الخاص بك يظهر أقل استجابة لأنه عند وصول اتصال، سيتم تشغيل مؤشر الترابط للاستماع لهذا الاتصال بأولوية أقل ولن تتمكن من العمل على الفور. سيتعين على العميل الانتظار لفترة أطول قبل أن يبدأ الخادم الخاص بك في معالجة طلبه.
لا يتم التعامل مع الطلبات في مؤشر ترابط المستمع. يفوض موضوع المستمع معظم العمل إلى مؤشرات الترابط الأخرى. إذا كان لديك ملزمة TCP واحدة فقط، فسيكون لديك موضوع مستمع واحد فقط، ولكن يمكنك معالجة العديد من الاتصالات المتزامنة. سيتم التعامل مع كل اتصال بواسطة مؤشر ترابط منفصل على الرغم من كونه مستمع واحد فقط.
على أي حال، يمكنك تغيير الأولوية عن طريق التعامل مع كائن الخادم OnBeforeListenerRun
حدث. يتلقى إشارة إلى TIdThread
التي تمثل مؤشر ترابط المستمع، حتى تتمكن من تعيين قيمة مختلفة Priority
خاصية. أيضا، لديك شفرة المصدر، حتى تتمكن من الدخول وتغيير تعريف tpListener
ثابت في idglobalcore.pas.. وبعد الرمز يستخدم هذه القيمة، وليس tpHighest
مباشرة.