2013-03-08 64 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