2016-07-22 2 views
0

Я использую DirectShowLib-2005 для моего проекта C#/WPF. Когда камера запускается, я запускаю управление средой:Остановка 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 потоков, а половина без имени, и я не вижу код или stacktrace. Моя проблема в том, что у меня есть поток, который вызывает 'hr = mediaCtrl.Run();' перед моим основным потоком (я добавил MessageBox с 'Thread.CurrentThread.ManagedThreadId'). И я не знаю, кто это назвал, и точки останова не останавливаются на этом. –

+0

Я перечислил так много потоков с вашим симптомом выше.Это означает, что проблема настолько распространена, и вам просто нужно сделать это дополнительное устранение неполадок, чтобы определить проблему, которая у вас есть. –

+0

Я прочитал все ссылки, но я все еще потерял эту проблему. Я новичок в управлении потоками, и приложение, которое я отлаживаю, не было разработано мной. Я идентифицировал вызов заблокированного потока обработчиком события. Я пытаюсь закрыть его, это, по-видимому, является причиной замораживания в соответствии со всем, что я читал. –

Смежные вопросы