2013-03-08 77 views
1

我有一个VideoObject类,它利用C++ DLL从网络摄像头捕获图像和视频。我被告知DLL使用DirectShow来做到这一点。它似乎也启动了一些我无法控制的线程。DLL导致Winforms UI在某些情况下运行缓慢

VideoObject类似乎本身工作正常;我可以捕捉图像和视频。但是,它的使用会对主界面的性能产生负面影响:变得非常滞后。

如果我实例化我VideoObject这样

public partial class ParentForm : Form 

    private VideoObject videoObject; 

    public ParentForm() 
    { 
     videoObject = new VideoObject(); 
    } 
} 

那么UI变得非常laggy。我的猜测是,无论VideoObject的底层DLL在做什么,它都会影响我的应用程序的UI线程。

现在,我可以通过在自己的MTA线程中启动VideoObject实例来缓解这种延迟。 (我完全新的C#,所以我猜下面可能不是很聪明。)

public partial class ParentForm : Form 

    private VideoObject videoObject; 
    private Thread videoObjectThread; 

    public ParentForm() 
    { 
     videoObjectThread = new Thread(new ThreadStart(() => videoObject = new VideoObject())); 
     videoObjectThread.SetApartmentState(ApartmentState.MTA); 
     videoObjectThread.Start(); 
    } 
} 

我现在可以用videoObject实例进行交互和用户界面不会落后,但只有当我做在Form的构造函数中没有进一步引用该实例。

如果我以任何方式与表单的构造函数中的此线程实例进行交互,UI将再次变得迟钝。就好像在我的Form的构造函数中与VideoObject的一个实例的任何直接交互一样,都会诱发UI的laggy行为。

有没有人有任何见解我看到的行为?

编辑:我应该澄清我的意思是'laggy'。我的意思是主面板的用户界面变得永久滞后和缓慢。没有其他影响; VideoObject上的所有操作都按预期工作,并且不会以任何方式运行较慢或延迟。

如果我不'触摸'窗体的构造函数中的VideoObject,UI的工作原理。随后调用VideoObject的方法不会导致UI运行缓慢。

这一切似乎取决于我是否访问主窗体的构造函数中的VideoObject。

回答

1

每次调用Video对象上的方法时,它都必须有一些开销,暂时阻止您用来与视频对象进行交互的线程。也许视频组件必须在调用方法或实例化对象时将大对象加载到内存中。

您是否尝试过对视频对象上的方法进行异步调用?在等待视频对象返回时,切勿阻止。

不知道视频组件的细节很难猜测。

你可以考虑的一件事可能是将视频对象包装在WCF服务中,并将其托管在它自己的进程中,然后使用NetTcpBinding与组件进行交互。

http://msdn.microsoft.com/en-us/library/bb332338.aspx

http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.aspx

+0

感谢您的答复。对象初始化时会有一些初始开销,但其他一些开销没有。即使我没有与实例交互,界面仍然非常滞后。 DLL中的某些内容导致了我想的问题。我做了一个编辑,试图更好地解释症状。再次欢呼。 – 2013-03-08 10:32:43

+0

是的,视频组件基本上公开了DLL的功能。我没有DLL的代码,但;我听说过的所有事情都是使用DirectShow! – 2013-03-08 10:53:32

相关问题