2014-03-11 2 views
2

У меня есть график, который занимает много времени, чтобы создавать и готовиться (5-10 секунд). Чтобы замерзнуть, я решил создать свой график в потоке, но случилось что-то странное. После запуска моего графика при отладке; Когда я в потоке, я вижу видео в моем окне. Но когда поток заканчивается, видео исчезает. Я определил все глобально о моем графике. Что не так с созданием графика в отдельном потоке?Создать график DirectShow в потоке

Благодаря

ответ

3

Можно создать график в боковом потоке, и это выполнимый сценарий. Однако эта часть информации недостаточно для надежного объяснения симптомов. Поскольку у вас есть видео, у вас, предположительно, есть фильтр рендеринга видео, особенно. работает в оконном режиме. Если он создает окно в этом фоновом потоке, тогда окно ожидает, что поток будет жив и даже больше, ожидается, что вы доставляете оконные сообщения в этом потоке. Это означает, что вы не можете выйти, как только запустите график.

Из-за окон, в том числе возможно внутренних, которые могут создавать фильтры для собственных нужд, безопаснее создавать графики фильтров в потоках STA. Это может быть боковой поток STA, на который вы создаете график, вы сохраняете его до тех пор, пока вы не уничтожите график, тем временем вы запустите цикл сообщений. Обратите внимание, что существует версия Fitler Graph Manager, подходящая для этого сценария:

CLSID_FilterGraphNoThread создает диспетчер фильтров по потоку приложения. Если вы используете этот CLSID, поток, который вызывает CoCreateInstance, должен иметь контур сообщения, который отправляет сообщения; в противном случае могут возникнуть взаимоблокировки. Кроме того, перед тем, как поток приложений завершается, он должен освободить диспетчер Graph Graph Filter и все объекты графа (например, фильтры, контакты, опорные часы и т. Д.).

+0

Вы хотите создать IGraphBuilder, используя CLSID_FilterGraphNoThread вместо 'IGraphBuilder grapbuilder = (IGraphBuilder) new FilterGraph();'? Я создал FilterGraphNoFilter, используя свой CLSID, но ничего не изменилось. Что с моим кодом? Большое спасибо –

+0

Нет, 'CLSID_FilterGraphNoThread' является лишь частью вашего решения (на самом деле это даже дополнительная часть). Основная часть заключается в том, что вы должны соблюдать окна, которые могли быть созданы любым фильтром графика во время приостановленного/запущенного состояния. Это включает в себя время жизни хостинга хостинга и пересылку сообщений. –

+0

Итак, вы имеете в виду, что мой поток должен быть жив все время, когда мой график работает? –

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