我正在开发一个完全是单线程的Windows程序,它对任何数据结构都没有保护。但是,该程序使用DirectShow API打开自己的内部消息调度,例如IVideoWindow :: put_Visible。因此,调用IVideoWindow :: put_Visible方法的事件处理函数会给其他事件处理函数带来破坏其数据的机会。
无论如何都要阻止API中的这种消息调度?
答案 0 :(得分:0)
这个问题对我来说有点不清楚。您是在谈论在内部进入模态消息循环的API吗?这会给你带来某种重入问题吗?如果是这种情况,那么可能有更好的方法来解决您的问题。如果API正在进入模态循环,那么无疑是一个很好的理由,你应该允许它这样做。 (在你的情况下,我猜想DirectShow正在内部与另一个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消息而退出时,它必须在退出后发布自己的退出消息(以便应用程序知道退出)。如果您不吃它,您的申请将退出。