Безопасно ли вызывать PeekMessage / GetMessage из фильтра FillBuffer () фильтра DirectShow? - PullRequest
0 голосов
/ 26 декабря 2011

У меня есть фильтр DirectShow, написанный на Delphi 6 с использованием библиотеки компонентов DSPACK.Это видео-фильтр push-источника, который получает свои исходные кадры от внешнего процесса взаимодействия, который я также написал.

Когда рабочий поток, который вызывает вызов FillBuffer () моего Filters, создается и запускается, когда начинается графиквверх, первое, что я делаю из этого рабочего потока, это создаю скрытое окно, используя AllocateHWND () для обработки сообщений WM_COPYDATA, которые содержат внешне сгенерированные кадры.Прямо перед тем, как нить уничтожена, я уничтожаю скрытое окно.Другими словами, скрытое окно создается и уничтожается в контексте выполнения рабочего потока, который вызывает FillBuffer ().Мое намерение состоит в том, чтобы позволить блоку FillBuffer () ожидать сообщения WM_COPYDATA или WM_QUIT.Внешний процесс взаимодействия отправит фреймы в мой фильтр, используя сообщение WM_COPYDATA и дескриптор WndProcc () моих скрытых окон.Я опубликую сообщение WM_QUIT в своем переопределении метода Inactive () для булавки (спасибо за этот совет @RomanR), чтобы разблокировать вызов FillBuffer () до выключения фильтра.

Мой вопрос:безопасно ли вызывать PeekMessage () или GetMessage () из вызова FillBuffer () с учетом этого сценария?Или есть потенциальные ловушки, которые могут возникнуть из-за этого в контексте выполнения графа DirectShow?Кроме того, видите ли вы какие-либо недостатки в моем общем подходе, которые я должен рассмотреть?

1 Ответ

1 голос
/ 26 декабря 2011

Безопасно, но не так разумно. FillBuffer вызывается в фоновом рабочем потоке, в котором обычно нет окон. Возможно, это будет только ваше окно, для которого вы собираетесь реализовать цикл сообщений. И окно здесь только с целью получения WM_COPYDATA сообщений. Похоже, что это может сработать, но вы, возможно, могли бы сделать намного проще без вспомогательных окон, передавая ваши данные между приложениями через именованные сопоставления файлов и события. В случае видео (у вас есть аудио, верно?) Вы также сможете оценить меньшую нагрузку на производительность.

...