如何处理带消息调度的第二个事件循环?

时间:2009-05-14 18:05:58

标签: windows event-handling directshow

我正在开发一个基本上是单线程的程序,它唯一的线程是主事件循环线程。因此,它的所有数据结构基本上都不受关键区域的保护。

在最近集成了一些基于DirectShow API的新功能之前,它一切正常。一些DirectShow API打开第二个事件循环,并在第二个循环内调度消息(即,不可预测地调用其他事件处理回调)。因此,当调用第二个事件处理函数时,它可能会损坏调用DirectShow API的函数正在访问的数据结构。

我在内核编程方面有一些经验。我想到的是,对于单线程程序,它应该如何处理它的数据结构就像内核应该如何处理每个CPU的数据结构一样。在内核中,当一个函数访问每个CPU数据时,它必须禁用中断(非常类似于第二个事件循环中的消息调度)。但是,我发现没有简单的方法可以避免调用DirectShow API或阻止在其中创建第二个事件循环,有什么办法吗?

2 个答案:

答案 0 :(得分:1)

互斥。信号灯。锁定。无论你想叫什么名字,这都是你需要的。

答案 1 :(得分:0)

根据确切的问题和您的代码,可以想到几种可能的解决方案:

  1. 在调用任何运行模态循环的API之前,请确保您的数据结构处于一致状态。
  2. 如果不可能,您可以使用简单的布尔变量来保护结构。如果已设置,则只需中止任何更新它的尝试或将更新排队等待以后。另一种选择是中止以前的操作。
  3. 如果问题是用户生成的事件,则在操作过程中禁用有问题的菜单或按钮。或者,您可以显示模态对话框。