我有一个使用DSPACK组件库在Delphi 6中编写的DirectShow过滤器。它是一个推送源视频过滤器,它从我也写过的外部协作过程接收其源帧。
当创建并运行调用我的Filters'FillBuffer()调用的工作线程时,当图启动时,我从该工作线程做的第一件事是使用AllocateHWND()创建一个隐藏窗口来处理WM_COPYDATA消息包含外部生成的帧。在线程被销毁之前,我销毁了隐藏的窗口。换句话说,隐藏窗口是在调用FillBuffer()的工作线程的执行上下文中创建和销毁的。我的意图是让FillBuffer()在等待WM_COPYDATA或WM_QUIT消息时阻塞。外部协作进程将使用WM_COPYDATA消息和我隐藏的窗口'WndProcc()的句柄向我的过滤器提交帧。我将在我的覆盖引脚的Inactive()方法中发布一条WM_QUIT消息(感谢提示@RomanR),在关闭过滤器之前取消阻止FillBuffer()调用。
我的问题是,在这种情况下,从FillBuffer()调用调用PeekMessage()或GetMessage()是否安全?或者在DirectShow图执行的上下文中是否存在可能出现的潜在缺陷?另外,您是否认为我需要考虑的整体方法存在任何缺陷?
答案 0 :(得分:1)
安全,但也不太合理。正在后台工作线程上调用FillBuffer
,该线程通常没有窗口。它可能只是你要实现消息循环的窗口。此窗口仅用于接收WM_COPYDATA
消息。听起来它可以解决,但是如果没有辅助窗口,通过命名文件映射和事件在应用程序之间传递数据,您可能会更容易。如果是视频(你有音频,对吗?),你也可以欣赏更小的性能开销。