سؤال

لقد لاحظت أن التلقائي التلقائي يتجمد تماما حلقة الرسالة (أحيانا) عندما تكون في منتصف مكالمة النيتون ()، حتى حظر رسالة الإشارة بشكل فعال.

بمعنى آخر:

  1. (UI) مؤشر ترابط جديد
  2. (UI) رمز المكالمات الناشئة ()؛ مهلة: 10s.
  3. (T2) Office يفتح الجهاز، مجموعة المكالمات ()
  4. (واجهة المستخدم)
  5. (واجهة المستخدم) انتهت مهلة النيتون، يستمر تنفيذ التعليمات البرمجية
  6. (UI) النافذة الرئيسية التي تتلقى إشارة وتستمر (ولكن فشل النثر)

أيه أفكار؟

تعديل: تمت إضافة UI / T2 لتحديد المواضيع. أيضا، أحاول تحويل مكتبة الطرف الثالث للمزامنة. تنطوي الأجهزة الافتتاحية تنطوي على مكالمة مفتوحة () ذلك بدوره يطرد حدث OpenOK أو OpenFailed، أحاول إنشاء مكالمة مفتوحة من BOOL () التي ترجع True / False اعتمادا على الحدث الذي تم طرده.

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

المحلول

... حتى حظر رسالة الإشارة بشكل فعال.

لا يمكنك "حظر إشارة" من إرسالها، فيمكنك فقط منع الخيط الآخر من الوصول إلى نقطة إعداد الحدث. لا تتطلب مقابض الانتظار مضخة للرسالة على الإطلاق.

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

نصائح أخرى

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

بسبب هذه المشكلة، كلما أمكن ذلك، أحاول عموما تجنب التشغيل التلقائي لصالح ManualResetevents.

سيكون ترتيب الأحداث التي تحتوي على manalresetevent (قمت بإدراج الحدث 2 ك 2A و 2B لإظهار أن ترتيب التشغيل الخاص بهم غير مضمون):

  1. مؤشر ترابط جديد
  2. أ. الخيط الأصلي يدعو الناظر ()؛ ب. مجموعة مكالمات موضوع جديدة ()؛
  3. يستيقظ الخيط الأصلي.
  4. استدعاءات الخيط الأصلي إعادة تعيين ()؛

قد تجد هذه لذلك نشر "في انتظار الصيانة أثناء الاستمرار في معالجة"
الخروج أيضا استدعاء الأساليب المتزامنة بشكل غير متزامن من MSDN.

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