我有一个使用DSPACK组件库用Delphi6编写的DirectShow过滤器。这是一个推送源视频过滤器,它从我编写的外部协作进程中接收其源帧。
当创建并运行调用过滤器的FillBuffer()调用的工作线程时,当图形启动时,我从该工作线程做的第一件事是使用AllocateHWND()创建一个隐藏窗口,以处理包含外部生成的框架的WM_COPYDATA消息。就在线程销毁之前,我销毁了隐藏的窗口。换句话说,隐藏窗口是在调用FillBuffer()的工作线程的执行上下文中创建和销毁的。我的目的是让FillBuffer()在等待WM_COPYDATA或WM_QUIT消息时阻塞。外部协作进程将使用WM_COPYDATA消息和隐藏窗口的WndProcc()句柄将帧提交给我的过滤器。我将在引脚的Inactive()方法的重写中发布一条WM_QUIT消息(感谢提示@RomanR),以便在关闭过滤器之前取消阻止FillBuffer()调用。
我的问题是,在这种情况下,从FillBuffer()调用中调用PeekMessage()或GetMessage()是否安全?或者,在DirectShow图形执行的上下文中,是否存在可能因此而产生的潜在陷阱?另外,你是否看到我的整体方法中有任何我需要考虑的缺陷?
发布于 2011-12-26 06:43:08
安全,但也不是那么合理。正在后台工作线程上调用FillBuffer
,该线程上通常没有窗口。它可能只是您要为其实现消息循环的窗口。并且这里的窗口仅用于接收WM_COPYDATA
消息。这听起来似乎是可行的,但如果没有助手窗口,通过命名文件映射和事件在应用程序之间传递数据,可能会更容易。如果是视频(你有音频,对吧?)您还可以享受较小的性能开销。
https://stackoverflow.com/questions/8631855
复制相似问题