CCmdQueue 类

[与此页面关联的功能 DirectShow 是一项旧功能。 它已被 MediaPlayerIMFMediaEngine媒体基金会中的音频/视频捕获取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

CCmdQueue是一个基类,它提供 CDeferredCommand 对象的队列和成员函数,用于添加、删除、检查状态和调用排队的命令。 对象 CCmdQueue 是实现 IQueueCommand 方法的 对象的一部分。 筛选器图管理器实现 IQueueCommand 方法,以便应用程序可以将命令排队到筛选器图。 实现 IQueueCommand 接口的筛选器直接使用此类。 如果要使用 CDeferredCommand 对象,队列必须派生自此类。

有两种同步模式:粗略和准确。 在粗略模式下,应用程序将等待指定时间到达,然后执行命令。 在准确模式下,应用程序将等待,直到对当时出现的示例开始进行处理,然后执行命令。 筛选器确定将实现哪个筛选器。 筛选器关系图管理器始终为在筛选器关系图管理器中排队的命令实现粗略模式。

如果要进行粗略同步,可能需要等待命令到期,然后执行该命令。 可以通过调用 CCmdQueue::GetDueCommand 来执行此操作。 如果要等待多个操作,请从 CCmdQueue::GetDueHandle 获取事件句柄,然后在发出信号时调用 CCmdQueue::GetDueCommand流时间 只会在调用 CCmdQueue::RunCCmdQueue::EndRun 成员函数之间提前。 无法保证如果设置了句柄,则会有命令准备就绪。 每次发出事件信号时,调用 GetDueCommand 成员函数 (可能超时为零) ;如果未准备好命令,则返回E_ABORT。

如果需要准确的同步,请调用 CCmdQueue::GetCommandDueFor 成员函数,并将要作为参数处理的样本传递。 这会返回以下内容:

  • 流时间命令在该流时间或流时间之前到期。
  • 在流时间呈现时或之前到期的演示时间命令。 仅在 CCmdQueue::RunCCmdQueue::EndRun 成员函数之间执行此操作,因为除此之外,从流时间到呈现时间的映射是未知的。
  • 任何演示时命令现在到期。

如果希望对可能在暂停模式下处理的示例进行准确的同步,则必须使用流时间命令。

在所有情况下,命令将保持排队状态,直到调用或取消。 事件句柄的设置和重置完全由此队列对象管理。

受保护的数据成员 说明
m_bRunning 运行状态的标志;在运行时设置 TRUE
m_dwAdvise 如果没有未完成的建议) ,则参考时钟的建议标识符 (零。
m_evDue 设置任何命令的到期时间。
m_listPresentation 存储呈现时间排队的命令。
m_listStream 存储以流时间排队的命令。
m_Lock 保护对列表的访问。
m_pClock 当前参考时钟。
m_StreamTimeOffset 包含 m_bRunningTRUE 时的流时间偏移量。
m_StreamTimeOffset 包含 m_bRunningTRUE 时的流时间偏移量。
成员函数 说明
CCmdQueue 构造 CCmdQueue 对象。
CheckTime 确定给定时间是否到期。
GetDueHandle 检索将发出信号的事件句柄。
可重写的成员函数 说明
EndRun 切换到停止或暂停模式。
GetCommandDueFor 检索在指定时间安排的延迟命令。
GetDueCommand 检索指向下一个到期命令的指针。
插入 CDeferredCommand 对象添加到队列。
新增功能 初始化要运行的命令,并返回新的 CDeferredCommand 对象。
Remove 从队列中删除 CDeferredCommand 对象。
运行 切换到运行模式。
SetSyncSource 设置用于计时的时钟。
SetTimeAdvise 使用引用时钟设置计时器事件。