我正在使用WPF和DirectShow编写一个应用程序,遇到了一个棘手的问题。我的应用程序通过使用DirectShowNet(DS的C#封装类)编写的静态类中的静态方法Start()和Stop()来利用DS。我在我的WPF窗口中有一个Windows Forms面板(通过WindowsFormsHost对象),需要将图形呈现到该面板上。以下是应用程序的一般流程:Start()方法构建图形并启动它;我传递我的Windows表单面板的句柄,并使用IVideoWindow接口将其呈现。Start()返回后,图形在后台运行。在某个时刻,调用Stop()方法;此方法停止图形并销毁它。
只要我从同一个线程中调用Start()和Stop(),一切都正常。但是,在我的应用程序中,我需要从不同的线程中调用它们。这种情况下,当我试图枚举过滤器时,在销毁图形的代码部分中会出现异常。我发现在使用DirectShow时需要使用多线程公寓(Multithreaded Apartment)。对于Windows Forms应用程序来说很容易;我只需在我的主方法上添加[MTAThread],就可以使一切顺利进行。
对于我的WPF应用程序,显然不是这样的选择。我的解决方法是在需要调用Start()和Stop()时启动新的MTA线程。这消除了异常,但引入了另一个问题。当Start()方法返回时,视频从渲染面板中消失。如果我在Start()方法的末尾放置一个Sleep,视频将一直可见,直到Sleep结束。此外,我已经验证图形在视频消失后继续运行。有人有什么建议吗?谢谢。
Kevin
只要我从同一个线程中调用Start()和Stop(),一切都正常。但是,在我的应用程序中,我需要从不同的线程中调用它们。这种情况下,当我试图枚举过滤器时,在销毁图形的代码部分中会出现异常。我发现在使用DirectShow时需要使用多线程公寓(Multithreaded Apartment)。对于Windows Forms应用程序来说很容易;我只需在我的主方法上添加[MTAThread],就可以使一切顺利进行。
对于我的WPF应用程序,显然不是这样的选择。我的解决方法是在需要调用Start()和Stop()时启动新的MTA线程。这消除了异常,但引入了另一个问题。当Start()方法返回时,视频从渲染面板中消失。如果我在Start()方法的末尾放置一个Sleep,视频将一直可见,直到Sleep结束。此外,我已经验证图形在视频消失后继续运行。有人有什么建议吗?谢谢。
Kevin