我有一個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