سؤال

أنا أقرأ البيانات من منافذ تسلسلية متعددة.أستخدم حاليًا معالج إشارة مخصصًا (عن طريق تعيين sa_handler) لمقارنة سلاسل الرسائل وتنبيهها بناءً على معلومات واصف الملف.كنت أبحث عن طريقة للحصول على سلاسل رسائل فردية مع معالجات إشارة فريدة، وفي هذا الصدد وجدت أنه سيتم استخدام استدعاء النظام المحدد.

الآن لدي الأسئلة التالية:

  1. إذا كنت أستخدم مؤشر ترابط (Qt) فأين يمكنني إجراء استدعاء النظام المحدد لمراقبة المنفذ التسلسلي؟
  2. هل مؤشر ترابط استدعاء النظام المحدد آمن؟
  3. هل يتطلب الأمر استخدامًا مكثفًا لوحدة المعالجة المركزية (CPU) نظرًا لوجود العديد من الأشياء التي تحدث في تطبيقي بما في ذلك تحديث واجهة المستخدم الرسومية؟

من فضلك لا تمانع، إذا وجدت هذه الأسئلة سخيفة.لم أستخدم أبدًا مثل هذه الآلية للاتصال التسلسلي.

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

المحلول

ال مواصفات POSIX (اختر) هو المكان المناسب للبحث عن select تعريف.أنا شخصيا أوصي poll - يتمتع بواجهة أفضل ويمكنه التعامل مع أي عدد من الأوصاف، بدلاً من الحد المحدد من قبل النظام.

إذا فهمت بشكل صحيح أنك تقوم بإيقاظ المواضيع بناءً على حالة بعض الأوصاف.الطريقة الأفضل هي أن يكون لكل مؤشر ترابط واصف خاص به ويحدد الاتصال بنفسه.كما ترى، لا يؤدي التحديد إلى تعديل حالة النظام، وطالما أنك تستخدم متغيرات مؤشر الترابط المحلية فسيكون الأمر آمنًا.ومع ذلك، ستحتاج بالتأكيد إلى التأكد من عدم إغلاق الواصف الذي يعتمد عليه الموضوع.

استخدام select/poll مع انتهاء المهلة، يترك "الانتظار" حتى جانب النواة، مما يعني عادةً وضع الخيط في وضع السكون.أثناء نوم الخيط، فإنه لا يستخدم أي وقت لوحدة المعالجة المركزية.فترة/لحلقة على أ select من ناحية أخرى، فإن الاتصال بدون مهلة سيمنحك استخدامًا أعلى لوحدة المعالجة المركزية حيث أنك تدور باستمرار في الحلقة.

أتمنى أن يساعدك هذا.

يحرر:أيضًا، select/poll يمكن أن يكون لها نتائج غير متوقعة عند العمل مع نفس واصف في مواضيع متعددة.السبب البسيط لذلك هو أنه قد يتم تنشيط الخيط الأول لأن الواصف جاهز للقراءة، ولكن يجب على الخيط الثاني انتظار التالي تنبيه "متاح للقراءة".

طالما أنك لست كذلك selectإذا كنت تستخدم نفس الواصف في سلاسل رسائل متعددة، فمن المفترض ألا تواجه مشكلة.

نصائح أخرى

إنها مكالمة نظام - أعتقد أنها يجب أن تكون آمنة.

لم أفعل هذا من قبل، لكنني سأكون متفاجئًا إذا لم يحدث ذلك.مدى كثافة وحدة المعالجة المركزية select() هذا يعتمد في رأيي إلى حد كبير على عدد مقابض الملفات التي تنتظرها. select() يتم استخدامه في الغالب للانتظار حتى يصبح عدد (> 1) من مؤشرات الملفات جاهزًا.

وينبغي أيضا أن نذكر ذلك select() لا ينبغي أن تستخدم لاستقصاء مقابض الملفات - لأسباب تتعلق بالأداء.الاستخدام العادي هو:لقد أنجزت عملك ويمكن أن يمر بعض الوقت حتى يحدث الشيء التالي.الآن يمكنك تعليق عمليتك من خلال تحديد والسماح بتشغيل عملية أخرى. select() عادةً ما يقوم بتعليق العملية النشطة.كيف يعمل هذا مع المواضيع، لست متأكدا!أعتقد أن العملية برمتها (وجميع المواضيع) معلقة.ولكن هذا قد يكون موثقا.يمكن أن يعتمد أيضًا (على Linux) على ما إذا كنت تستخدم سلاسل عمليات النظام أو سلاسل عمليات المستخدم.لن تعرف النواة مؤشرات ترابط المستخدم وبالتالي ستعلق العملية برمتها.

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