Использовать COINIT_APARTMENTTHREADED или COINIT_MULTITHREADED в Media Foundation?
В своем исследовании Media Foundation я натолкнулся на несколько, казалось бы, противоречивых советов из двух очень авторитетных источников.
От MSDN:Media Foundation и COM: https://msdn.microsoft.com/en-us/library/windows/desktop/ee892371(v=vs.85).aspx
В Media Foundation асинхронная обработка и обратные вызовы обрабатываются рабочими очередями. Рабочие очереди всегда имеют многопоточные потоки (MTA), поэтому приложение будет иметь более простую реализацию, если оно также будет работать в потоке MTA. Поэтому рекомендуется вызывать CoInitializeEx с флагом COINIT_MULTITHREADED.
Затем из книги "Разработка приложений Microsoft Media Foundation - Антон Полингер" стр. 24:
Примечание. MF - это многопоточная система, что означает, что методы интерфейса COM могут вызываться из произвольных потоков. Следовательно, при вызове CoInitializeEx () необходимо инициализировать COM с параллелизмом объекта с многопоточностью, передав параметр COINIT_ APARTMENTTHREADED. Ваши объекты могут также нуждаться в использовании примитивов синхронизации, таких как блокировки, для управления доступом к внутренним переменным путем одновременного запуска потоков.
Кроме того, я видел много примеров кода Media Foundation в GitHub, который использует COINIT_APARTMENTTHREADED.
Я разрабатываю RTSP-клиент, который использует Media Foundation для потоковой передачи нескольких видеопотоков с IP-камеры на экран Windows. Я буду использовать несколько потоков в своем приложении, поэтому я считаю, что будет очень важно получить окончательный ответ по этому вопросу. Может кто-нибудь объяснить, пожалуйста, противоречие и посоветовать, как правильно поступить?
1 ответ
Media Foundation не будет использовать маршалинг (то есть они используют прямую связь), а его объекты используют модель квартиры "Оба" со свободным потоковым маршалингом во время выполнения.
Вы можете выбрать модель квартиры, MTA и STA будут работать. Рабочие потоки, запущенные Media Foundation, будут всегда инициализироваться как MTA (особенно потому, что дизайн MF не предполагает выравнивания потоков, например, в рабочих очередях, и нет смысла в выполнении STA; управляющий поток, инициализированный приложением, может быть STA).
То есть нет ничего плохого в инициализации управляющего потока как STA. Это не влияет на вызовы Media Foundation API. Документация предлагает инициализацию MTA по той единственной причине, что при инициализации всех потоков как MTA нет шансов перепутать квартиры по ошибке, что было бы особенно легко, поскольку API активно передает COM-указатели между потоками, игнорируя стандартные правила COM-квартир. Если вы понимаете, что это поведение не повлияет на вас, инициализация STA будет вам полезна. Как вы нашли много примеров Media Foundation, и приложения выполняют инициализацию STA.