ปิดการส่งข้อความภายในตัวจัดการ

ฉันกำลังทำงานกับโปรแกรม Windows ที่เป็นเธรดเดียวและไม่มีการป้องกันโครงสร้างข้อมูลใดๆ อย่างไรก็ตาม โปรแกรมใช้ DirectShow API ซึ่งเปิดการส่งข้อความภายในของตัวเอง เช่น IVideoWindow::put_Visible เป็นต้น ดังนั้นฟังก์ชันการจัดการเหตุการณ์ซึ่งเรียกใช้เมธอด IVideoWindow::put_Visible จะทำให้ฟังก์ชันการจัดการเหตุการณ์อื่นๆ มีโอกาสที่จะทำลายข้อมูลของมัน

มีวิธีป้องกันการส่งข้อความภายใน API หรือไม่


person Middleware    schedule 10.05.2009    source แหล่งที่มา


คำตอบ (1)


คำถามไม่ชัดเจนสำหรับฉันเล็กน้อย คุณกำลังพูดถึง API ที่เข้าสู่ลูปข้อความโมดอลภายในหรือไม่? นี่เป็นการสร้างปัญหาการกลับเข้ามาใหม่สำหรับคุณหรือไม่? หากเป็นเช่นนั้น อาจมีวิธีแก้ปัญหาที่ดีกว่านี้ หาก API เข้าสู่ Modal Loop ก็ย่อมมีเหตุผลที่ดีอย่างไม่ต้องสงสัย และคุณควรปล่อยให้มันทำเช่นนั้น (ในกรณีของคุณ ฉันเดาว่า DirectShow กำลังสื่อสารกับวัตถุ COM อื่นภายใน) หากเขียนอย่างถูกต้อง modal loop จะยังคงส่งข้อความไปยังหน้าต่างอื่นบนเธรดเดียวกัน

ไม่ว่าในกรณีใด หากคุณต้องการทำสิ่งนี้จริงๆ ให้ทำดังนี้:

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

ขั้นตอนสุดท้ายเป็นสิ่งสำคัญ เมื่อ modal loop ออกเนื่องจากข้อความ WM_QUIT มันจะต้องโพสต์ข้อความออกของตัวเองหลังจากออก (เพื่อให้แอปรู้ว่าจะออก) ถ้าไม่กินใบสมัครจะออก

person Peter Ruderman    schedule 04.06.2009