Поделиться через


Класс CCmdQueue

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Класс CCmdQueue является базовым классом, предоставляющим очередь объектов CDeferredCommand и функций-членов для добавления, удаления, проверка состояния и вызова команд в очереди. Объект CCmdQueue является частью объекта , реализующего методы IQueueCommand . Диспетчер графов фильтров реализует методы IQueueCommand , чтобы приложения могли помещать команды в граф фильтра. Фильтры, реализующие интерфейс IQueueCommand , используют этот класс напрямую. Если вы хотите использовать объекты CDeferredCommand , очередь должна быть производной от этого класса.

Существует два режима синхронизации: грубый и точный. В грубом режиме приложение ожидает прибытия указанного времени, а затем выполняет команду. В точном режиме приложение ожидает, пока не начнется обработка примера, который отображается в то время, а затем выполняет команду . Фильтр определяет, какой из них он будет реализовывать. Диспетчер графов фильтров всегда реализует грубый режим для команд, помещенных в очередь в диспетчере графов фильтров.

Если вам нужна грубая синхронизация, вероятно, потребуется подождать, пока не будет выполнена команда, а затем выполнить ее. Это можно сделать, вызвав CCmdQueue::GetDueCommand. Если вам нужно дождаться нескольких вещей, получите дескриптор события из CCmdQueue::GetDueHandle , а затем вызовите CCmdQueue::GetDueCommand при появлении сигнала об этом. Время потока будет переходить только между вызовами функций-членов CCmdQueue::Run и CCmdQueue::EndRun . Нет никакой гарантии, что если дескриптор задан, команда будет готова. При каждом сигнале о событии вызывайте функцию-член GetDueCommand (вероятно, с нулевым тайм-аутом); может возвращать E_ABORT, если команда не готова.

Если требуется точную синхронизацию, вызовите функцию-член CCmdQueue::GetCommandDueFor и передайте примеры, которые вы собираетесь обработать в качестве параметра. При этом возвращается следующее:

  • Команда времени потока, которая должна быть выполнена в момент или до этого времени потока.
  • Команда времени презентации, выполненная в момент или до представления времени потока. Это можно сделать только между функциями-членами CCmdQueue::Run и CCmdQueue::EndRun , так как вне этого сопоставление времени потока с временем представления неизвестно.
  • Любая команда времени презентации должна быть выполнена сейчас.

Если требуется точную синхронизацию для примеров, которые могут обрабатываться в приостановленном режиме, необходимо использовать команды времени потока.

Во всех случаях команды остаются в очереди до вызова или отмены. Настройка и сброс дескриптора событий полностью управляются этим объектом очереди.

Защищенные члены данных Описание
m_bRunning Флаг для состояния выполнения; при выполнении установите значение TRUE .
m_dwAdvise Сообщить идентификатор из эталонных часов (ноль, если нет необработанных рекомендаций).
m_evDue Задает время выполнения каких-либо команд.
m_listPresentation Хранит команды, помещенные в очередь во время презентации.
m_listStream Хранит команды, помещенные в очередь во время потока.
m_Lock Защищает доступ к спискам.
m_pClock Текущие эталонные часы.
m_StreamTimeOffset Содержит смещение времени потока, если m_bRunning имеет значение TRUE.
m_StreamTimeOffset Содержит смещение времени потока, если m_bRunning имеет значение TRUE.
Функции элементов Описание
CCmdQueue Создает объект CCmdQueue .
CheckTime Определяет, истекает ли заданное время.
GetDueHandle Извлекает дескриптор события, который будет сигнализировать.
Переопределимые функции-члены Описание
EndRun Переключается в остановленный или приостановленный режим.
GetCommandDueFor Извлекает отложенную команду, запланированную на указанное время.
GetDueCommand Извлекает указатель на следующую команду, которая должна быть выполнена.
Вставить Добавляет объект CDeferredCommand в очередь.
Новые функции Инициализирует выполняемую команду и возвращает новый объект CDeferredCommand .
Удалить Удаляет объект CDeferredCommand из очереди.
Выполнить Переключается в режим выполнения.
SetSyncSource Задает часы, используемые для синхронизации.
SetTimeAdvise Настраивает событие таймера со ссылочными часами.