我正在使用 WPF 和 DirectShow 编写一个应用程序,但遇到了一个棘手的问题。我的应用程序通过静态方法 Start() 和 Stop() 在使用 DirectShowNet(DS 的 C# 包装类)编写的静态类中使用 DS。我的 WPF 窗口中有一个 Windows 窗体面板(通过 WindowsFormsHost 对象),我需要将图形渲染到该面板。这是应用程序的一般流程: Start() 方法构建图形并启动它;我传递了我的 windows 表单面板的句柄并使用 IVideoWindow 接口(interface)呈现给它。 Start() 返回,图形在后台运行。在某些时候,Stop() 被调用;此方法停止图形并销毁它。
只要我从同一个线程调用 Start() 和 Stop() 一切正常。但是,我需要从我的应用程序中的不同线程调用它们。在这种情况下,我会在破坏图形的代码部分出现异常(特别是当我尝试枚举过滤器时)。我发现在使用 DirectShow 时需要使用多线程单元。使用 Windows 窗体应用程序很容易做到这一点;我只是在我的主要方法上抛出一个 [MTAThread] 并且一切正常。
对于我的 WPF 应用程序,这显然不是一个选项。我的解决方法是在需要调用 Start() 和 Stop() 时启动新的 MTA 线程。这摆脱了异常,但引入了另一个问题。当 Start() 方法返回时,视频从渲染面板中消失。如果我在 Start() 方法的末尾放置 Sleep,则视频将一直可见,直到 Sleep 结束。此外,我已经验证了在视频消失后图形继续运行。有没有人对如何进行有任何建议?谢谢。
凯文
最佳答案
抛出哪个异常?我在猜测类似这样的事情:“调用线程无法访问这个对象,因为另一个线程拥有它。”
在这种情况下,请使用正确的调度程序进行调用,如 here 所述。
关于c# - DirectShow/WPF 线程问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4881624/