0

我有一个使用 DSPACK 组件库用 Delphi 6 编写的 DirectShow 过滤器。它是一个推送源视频过滤器,它从我也编写的外部合作进程接收其源帧。

当创建并运行调用我的过滤器的 FillBuffer() 调用的工作线程时,当图形启动时,我从该工作线程做的第一件事是使用 AllocateHWND() 创建一个隐藏窗口来处理包含外部的 WM_COPYDATA 消息生成的帧。就在线程被销毁之前,我销毁了隐藏的窗口。换句话说,隐藏窗口是在调用 FillBuffer() 的工作线程的执行上下文中创建和销毁的。我的意图是让 FillBuffer() 在等待 WM_COPYDATA 或 WM_QUIT 消息时阻塞。外部合作进程将使用 WM_COPYDATA 消息和隐藏窗口的 WndProcc() 的句柄将帧提交给我的过滤器。我将在我对 pin 的 Inactive() 方法的覆盖中发布一条 WM_QUIT 消息(感谢@RomanR 的提示),

我的问题是,在这种情况下,从 FillBuffer() 调用中调用 PeekMessage() 或 GetMessage() 是否安全?或者,在 DirectShow 图形执行的上下文中是否存在由此发生的潜在缺陷?另外,您是否看到我需要考虑的整体方法中的任何缺陷?

4

1 回答 1

1

安全,但也不那么合理。FillBuffer正在后台工作线程上调用,该线程通常没有窗口。可能只有您要为其实现消息循环的窗口。窗口在这里只是为了接收WM_COPYDATA消息。听起来它可以解决,但如果没有帮助窗口,通过命名文件映射和事件在应用程序之间传递数据,您可能会做得更容易。如果是视频(您有音频,对吗?),您还可以享受更小的性能开销。

于 2011-12-25T22:43:08.327 回答