0

我刚刚有一个很长的调试会话,这是由使用 DSPACK 组件库的 Delphi 6 DirectShow 应用程序中的“陈旧”接口引用引起的。如您所知,当过滤器图处于活动状态时需要执行一些操作,而当过滤器图必须处于非活动状态时,需要对组件参数执行其他操作。问题是您最终可能会得到仍然具有初始化值(已分配,而不是 NIL)的 DirectShow 接口引用,但对于当前的 Filter Graph 化身无效,因为它们是在 Filter Graph 的先前化身期间创建的。在打开和关闭过滤器图以在“实时”发现操作和离线配置操作之间切换时,这并不难做到。

例如,您可能有一个 IBaseFilter 引用,该引用是您在第一次激活过滤器图时分配的,您在停用和重新激活过滤器图后尝试重新使用该引用。接口引用现在是“陈旧的”,因为它不属于 Filter Graph 的当前化身,而是属于以前的化身。这会导致各种奇怪且不直观的 DirectShow 错误消息,这些错误消息并不是它们看起来的那样,但实际上是由于接口引用过时造成的。

有没有人想出一种方法,无论是通过约定还是通过一些聪明的解决方案,例如与过滤器图的生命周期相关的 DirectShow 智能指针等,以防止这种情况发生?或者是唯一对接口引用使用保持谨慎的解决方案?

4

1 回答 1

1

作为过滤器开发人员,当过滤器收到一些处理请求并且过滤器似乎已从图中删除或更改其状态时,您会返回错误代码。

从应用程序端,您可以控制实现任何类型的同步以指示操作终止。例如,在停止/释放过滤器图之前,您可以设置一个终止标志(布尔变量),并在一种可能较晚且需要同步的处理回调中检查该标志并知道何时该中止处理由于未完成的终止请求。

于 2011-11-14T09:28:26.400 回答