سؤال

يمكنني استخدام مكون 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 مباشرة.

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