سؤال

وأنا أعمل على برنامج ويندوز الذي هو واحد الخيوط تماما وليس لديها الحماية للأي بنية البيانات. ومع ذلك، فإن استخدام برنامج ديريكتشو API التي تفتح الخاصة بهم الداخلي الرسالة إيفاد، IVideoWindow :: put_Visible على سبيل المثال. وبالتالي فإن وظيفة معالجة الحدث الذي يستدعي IVideoWindow :: put_Visible الطريقة تعطي فرصة أخرى وظيفة معالجة الحدث لتدمير البيانات الخاصة به.

وهناك على أية حال لمنع مثل هذه الرسالة إيفاد ضمن API؟

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

المحلول

والسؤال غير واضح قليلا بالنسبة لي. هل نتحدث عن API الذي يدخل حلقة رسالة الوسائط داخليا؟ وهذا خلق نوعا من مشكلة إعادة entrancy بالنسبة لك؟ إذا كان هذا هو الحال، ثم ربما يكون هناك أفضل الطرق لحل مشكلتك. إذا كان API يدخل حلقة مشروط، ثم هناك بلا شك سبب وجيه، ويجب أن يسمح لها أن تفعل ذلك. (في حالتك، كنت أعتقد أن ديريكتشو هو التواصل مع كائن COM آخر داخليا.) إذا كان مكتوب بشكل صحيح، وحلقة مشروط لا تزال ترسل رسائل إلى نوافذ أخرى في نفس الموضوع.

في أي حال، إذا كنت تريد حقا أن تفعل هذا، وهنا الطريقة:

PostQuitMessage( 0 ); // Signal quit to force the upcoming loop to exit
APIFunc(); // Enters modal loop internally
MSG msg;
PeekMessage( &msg, NULL, WM_QUIT, WM_QUIT, PM_REMOVE ); // Eat the next WM_QUIT

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

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