CCmdQueue 類別

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 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 成員函式之間執行這項操作,因為在此以外,無法得知從資料流程時間到簡報時間的對應。
  • 任何簡報時間命令現在到期。

如果您想要針對在暫停模式期間可能處理的樣本進行精確的同步處理,您必須使用資料流程時間命令。

在所有情況下,命令都會保持佇列,直到呼叫或取消為止。 事件控制碼的設定和重設完全由這個佇列物件管理。

受保護的資料成員 Description
m_bRunning 執行狀態的旗標;執行時設定 TRUE
m_dwAdvise 如果沒有未完成的建議) ,則從參考時鐘建議識別碼 (零。
m_evDue 設定任何命令到期的時間。
m_listPresentation 儲存以簡報時間排入佇列的命令。
m_listStream 儲存以資料流程時間排入佇列的命令。
m_Lock 保護清單的存取權。
m_pClock 目前的參考時鐘。
m_StreamTimeOffset 包含 m_bRunningTRUE時的資料流程時間位移。
m_StreamTimeOffset 包含 m_bRunningTRUE時的資料流程時間位移。
成員函數 Description
CCmdQueue 建構 CCmdQueue 物件。
CheckTime 判斷指定的時間是否到期。
GetDueHandle 擷取將發出訊號的事件控制碼。
可覆寫的成員函式 Description
EndRun 切換為已停止或暫停模式。
GetCommandDueFor 擷取在指定時間排程的延遲命令。
GetDueCommand 擷取下一個到期命令的指標。
插入 CDeferredCommand 物件新增至佇列。
新增功能 初始化要執行的命令,並傳回新的 CDeferredCommand 物件。
移除 從佇列中移除 CDeferredCommand 物件。
執行 切換至執行模式。
SetSyncSource 設定用於計時的時鐘。
SetTimeAdvise 使用參考時鐘設定計時器事件。