1

我有一个VideoObject类使用 C++ DLL 从网络摄像头捕获图像和视频。我被告知 DLL 使用 DirectShow 来执行此操作。它似乎也启动了几个我无法控制的自己的线程。

VideoObject课程本身似乎运行良好。我可以捕捉图像和视频。但是,它的使用会对主 UI 的性能产生负面影响:它变得非常滞后。

如果我VideoObject像这样实例化我的

public partial class ParentForm : Form

    private VideoObject videoObject;

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

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

VideoObject现在,我可以通过在它自己的 MTA 线程中启动实例来缓解这种滞后。(我对 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实例交互,并且 UI 不会滞后,但前提是我不再在 Form 的构造函数中进一步引用该实例。

如果我以任何方式在 Form 的构造函数中与这个线程实例交互,UI 将再次变得迟钝。就好像与VideoObject我的表单构造函数中的实例的任何直接交互都会导致 UI 的滞后行为。

有人对我所看到的行为有任何见解吗?

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

如果我不“触摸”表单构造函数中的 VideoObject,则 UI 可以完美运行。随后调用 VideoObject 的方法也不会导致 UI 运行缓慢。

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

4

1 回答 1

1

每次调用 Video 对象上的方法时,它都必须有一些开销来临时阻塞您用来与视频对象交互的线程。当调用方法或实例化对象时,可能 Video 组件必须将大对象加载到内存中。

您是否尝试过对视频对象上的方法进行异步调用?在等待视频对象从它正在做的任何事情中返回时,实际上不会阻塞。

在不知道视频组件的细节的情况下,很难做出猜测。

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

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

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

于 2013-03-08T10:14:09.123 回答