سؤال

لا بد لي من تنفيذ بعض التعليمات البرمجية في سياق الموضوع الرئيسي. أنا أستخدم Lazarus + FPC. أتلقى حدثًا من موضوع داخل مكتبة DLL (مكتبة مشتركة إذا كان على Linux) ويتم استدعاء وظيفة رد الاتصال الخاصة بي. لاحظ أن هذه الوظيفة ليست عضوًا في أي فئة بل وظيفة تقليدية قائمة بذاتها مع توجيه "CDECL" المرفق.

لا بد لي من Triger معالج حدث خاصية من هذا القبيل لكل رسالة أتلقاها. ويجب أن يتم تمرير هذه الأحداث في سياق الخيط الرئيسي. أنا أعرف حلين من هذا القبيل:

  1. postmessage
  2. application.queueasynccall

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

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

لذلك أريد أن أعرف ما هو الحل الأفضل هنا (ربما QueueAsynccall) وكيف يمكنني التأكد من أن رسالتي (المكالمة) ستتم معالجتها في الإطار الزمني المقبول؟

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

المحلول

لا يمكنك أن تكون متأكدًا بنسبة 100 ٪ ، تمامًا كما لا يمكنك في أي نظام غير حقيقي. إذا تم تعليق MainThread ، فلن يتحقق من الرسائل أو الأحداث الأخرى في الحلقة الرئيسية. هذا امر طبيعي.

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

إذا نظرت إلى application.queueasynccall ، فأنا لا أرى أي معالجة آافية (لا توجد قوائم قوائم قفل أو قفل) ، بحيث يتم خارجها.

أعلم أن Lazarus يتم محاكاة PostMessage إلى حد ما على غير النوافذ ، وقد راجعت التنفيذ ولديه قفل ، لذلك أفترض أنه آمن متعدد الترابطات.

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