Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在线程中创建DirectShow图形_C#_C++_Video_Directshow_Directshow.net - Fatal编程技术网

C# 在线程中创建DirectShow图形

C# 在线程中创建DirectShow图形,c#,c++,video,directshow,directshow.net,C#,C++,Video,Directshow,Directshow.net,我有一个需要很长时间才能创建和准备好的图表(5-10秒)。为了避免冻结,我决定在线程中创建我的图形,但奇怪的事情发生了。在我运行我的图形之后,在调试时;当我在线程中时,我可以在窗口中看到视频。但当线程结束时,视频就会消失。我对我的图形进行了全局定义。在单独的线程中创建图形有什么问题 感谢可以在侧线程中创建图形,这是一个可行的场景。然而,仅此一条信息不足以可靠地解释症状。当您有视频时,您应该有视频渲染器过滤器,尤其是在窗口模式下运行。如果它在这个后台线程上创建了一个窗口,那么窗口希望线程处于活动状

我有一个需要很长时间才能创建和准备好的图表(5-10秒)。为了避免冻结,我决定在线程中创建我的图形,但奇怪的事情发生了。在我运行我的图形之后,在调试时;当我在线程中时,我可以在窗口中看到视频。但当线程结束时,视频就会消失。我对我的图形进行了全局定义。在单独的线程中创建图形有什么问题


感谢

可以在侧线程中创建图形,这是一个可行的场景。然而,仅此一条信息不足以可靠地解释症状。当您有视频时,您应该有视频渲染器过滤器,尤其是在窗口模式下运行。如果它在这个后台线程上创建了一个窗口,那么窗口希望线程处于活动状态,甚至更重要的是,希望您在这个线程上传递窗口消息。这意味着您不能在运行图形后立即退出

由于windows(可能包括过滤器根据自身需要创建的内部窗口),因此在STA线程上创建过滤器图更安全。这可以是一个创建图形的侧STA线程,在销毁图形之前保持它的活动状态,同时在其上运行消息循环。注意:有一个适合此场景的Fitler Graph Manager版本:

在应用程序线程上创建筛选器图形管理器。如果使用此CLSID,则调用CoCreateInstance的线程必须有一个分派消息的消息循环;否则,可能会出现死锁。此外,在应用程序线程退出之前,它必须释放过滤器图形管理器和所有图形对象(例如过滤器、管脚、参考时钟等)


您的意思是我应该使用CLSID_FilterGraphNoThread而不是
IGraphBuilder GraphBuilder=(IGraphBuilder)new FilterGraph()创建IGraphBuilder吗?我使用它的CLSID创建了FilterGraphNoFilter,但没有任何更改。我的代码出了什么问题?非常感谢您不,
CLSID\u FilterGraphNoThread
只是您解决方案的一部分(实际上,它甚至是可选部分)。主要部分是,您必须遵守在暂停/运行状态下由图形的任何筛选器创建的窗口。这包括托管线程生存期和消息泵送。那么你的意思是我的线程应该在我的图运行的所有时间都处于活动状态?我在线程中创建了我的图,并在图运行的所有时间都保持线程处于活动状态。在一个循环中,我调用了
Application.DoEvents()
来处理消息。一切都与此场景配合使用。你认为这是个好主意吗?