2013-06-19 3 views
0

Я работаю с простым фильтром directshow, который получен из CBaseRenderer в базовых классах directshow, и я получаю тупики в этом классе.Прямая версия CBaseRenderer безопасна?

У меня был хороший Google, и нашел кого-то, кто имел exact same problem (тупиком между InterfaceLock в СТОП и RendererLock в Receive), но он не получил никаких ответов, что предполагает его редкое обстоятельство что он и я получили наш код (а не ошибку в базовом классе MS).

Итак, кто-нибудь еще видел эту проблему? Должен ли я получить свой фильтр (который не делает столько TBH) от CBaseRenderer или перейти прямо к классам CBaseFilter/CBaseInputPin? Если я должен переопределить WaitForReceiveToComplete, что мне там положить?

Я вернусь к основам и посмотрю на фильтр образцов дампа, но мне все равно будут интересны ответы людей, у которых есть опыт использования CBaseRenderer.

+0

Там может быть тупик, но если вы создадите свой собственный рендерер - у вас есть весь исходный код для его устранения (например, не удерживая внешнюю блокировку или не разблокируя ее при ожидании сообщений и т. Д.). –

+0

@RomanR. Я не занимаю никаких замков CBaseRenderer, у меня есть свои собственные (как указано в документах), но я пытаюсь понять, что я должен сделать, чтобы заставить базовый класс работать ... возможно, мне следует начать блокировки базовых классов. Я должен попробовать. – gbjbaanb

+0

Я понимаю, что вы зашли в тупик вокруг 'm_InterfaceLock'. У меня никогда не было этого, поэтому никакого решения не было у меня на голове, но, глядя на код, он выглядит вполне возможным. Я бы сказал, что проблема заключается в том, что 'for' просматривает' WaitForReceiveToComplete', который должен запускаться с разблокированной блокировкой - это то, что я попытаюсь добавить в код BaseClasses. –

ответ

2

Я полагаю, что проблема может быть вокруг этого цикла в BASECLASSES \ renbase.cpp:

void CBaseRenderer::WaitForReceiveToComplete() 
{ 
    // NOTE: m_InterfaceLock is locked higher on the call stack 

    for (;;) { 
     if (!m_bInReceive) { 
      break; 
     } 

     MSG msg; 
     // Receive all interthread snedmessages 
     PeekMessage(&msg, NULL, WM_NULL, WM_NULL, PM_NOREMOVE); 

     // TODO: Unlock m_InterfaceLock until the end of the loop 

     Sleep(1); 
    } 

Комментариев выше объяснение проблемы - бесконечный цикл может принимать параллельную нить пытается ввести m_InterfaceLock.

Если это так, спальные отпертые там могут дать шанс прорваться.

+0

, в конце концов, я вернулся к основам и создал новый фильтр, основанный на образце дампа. Он работает, хотя по-прежнему есть небольшие нитки, которые я должен был решить в методе получения булавки, но по крайней мере теперь я контролирую блокировки. Любой класс, у которого есть 2 замка и занятый ожидание на переменной bool, плохо написано ИМХО. – gbjbaanb

+0

Это должно быть событие вместо bool ... но у нас есть то, что у нас есть. Код 10 или, возможно, 15 лет, люди в MS не обновляют эту базу кода без серьезных причин. –

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