我有一个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。
感谢您的答复。对象初始化时会有一些初始开销,但其他一些开销没有。即使我没有与实例交互,界面仍然非常滞后。 DLL中的某些内容导致了我想的问题。我做了一个编辑,试图更好地解释症状。再次欢呼。 – 2013-03-08 10:32:43
是的,视频组件基本上公开了DLL的功能。我没有DLL的代码,但;我听说过的所有事情都是使用DirectShow! – 2013-03-08 10:53:32