2016-07-22 91 views
0

我爲我的C#/ WPF項目使用DirectShowLib-2005。當相機啓動時,我運行媒體控制:停止IMediaControl永不結束

m_FilterGraph = new FilterGraph() as IFilterGraph2; 
/* Initializations */ 
IMediaControl mediaCtrl = m_FilterGraph as IMediaControl; 
hr = mediaCtrl.Run(); 
DsError.ThrowExceptionForHR(hr); 

應用程序運行,相機工作良好。但有時(並非總是)當我退出應用程序凍結時。我暫停了調試器,並且我看到應用程序在以下行停止:

if (m_FilterGraph != null) 
{ 
    IMediaControl mediaCtrl = m_FilterGraph as IMediaControl; 
    mediaCtrl.Stop(); // <= *** Blocked here *** 
    Marshal.ReleaseComObject(m_FilterGraph); 
    m_FilterGraph = null; 
} 

如何防止此凍結?我可以添加一個時間或嘗試/趕上?

回答

3

如果您在look for it以上,您會發現一些討論類似凍結症狀的對話以嘗試停止流式傳輸。

單獨執行IMediaControl.Stop就不錯,並且發佈了代碼片段。重要的是,流是多線程的,並且調用涉及與流線程的同步:指示它停止並等待完成;也涉及停止所有參與的過濾器。線程問題,任何過濾器或者 - 經常 - 甚至從過濾器到控制代碼的回調都會忽略線程概念,這可能會導致死鎖。

您對問題的描述是不完整的。當你面臨這種凍結時,你需要:

  1. 確保你瞭解管道的拓撲結構;您需要了解(幷包括在這樣的問題)細節上參與過濾器和引腳連接
  2. 確保你從正確的線程停止圖形,特別是不能從某些過濾器的回調
  3. 附加一個調試和檢查線程狀態,但是不僅僅是調用凍結Stop(其可能具有零有意義的細節)的線程,而且還有其他線程,以查找其他相關的阻止停止同步的線程。

這個問題通常是你的代碼在停止流式傳輸時造成死鎖,或者是一個有問題的參與過濾器。

+0

我已經嘗試列出所有與調試器的線程。在我的主窗口打開之前,我已經有10個線程在運行,一半沒有名字,我看不到代碼或堆棧跟蹤。我的問題是我有一個線程調用'hr = mediaCtrl.Run();'在我的主線程之前(我用Thread.CurrentThread.ManagedThreadId添加了MessageBox)。我不知道是誰叫它,斷點不停止。 –

+0

我列出瞭如此多的線索,並在上面顯示了您的症狀。這意味着問題非常普遍,您只需執行此附加疑難解答即可識別您遇到的問題。 –

+0

我已經閱讀了所有的鏈接,但我仍然迷失在這個問題上。我是線程管理的初學者,我正在調試的應用程序不是由我開發的。我通過事件處理程序識別了阻塞的線程調用。我試圖關閉它,它似乎是根據我讀過的所有內容凍結的原因。 –