CAMThread 類別

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。

類別 CAMThread 是用來管理背景工作執行緒的抽象類別。

受保護的成員變數 Description
m_hThread 執行緒的控制碼。
公用成員變數 Description
m_AccessLock 鎖定執行緒不受其他執行緒存取的重要區段。
m_WorkerLock 鎖定執行緒之間共用資料的重要區段。
公用方法 Description
CAMThread 建構函式方法。
~ CAMThread 解構函式方法。 虛擬。
InitialThreadProc 建立執行緒時呼叫 ThreadProc 方法。
建立 建立執行緒。
CallWorker 向執行緒發出要求。
關閉 等候執行緒結束,然後釋放其資源。
ThreadExists 查詢執行緒是否存在。
GetRequest 等候下一個要求。
CheckRequest 檢查是否有要求,而不封鎖。
回覆 回復要求。
GetRequestHandle 擷取 CallWorker 方法發出訊號之事件的控制碼。
GetRequestParam 擷取最新的要求。
CoInitializeHelper 線上程開頭呼叫 CoInitializeEx。
純虛擬方法 Description
ThreadProc 執行緒程式。

備註

這個類別提供建立背景工作執行緒、將要求傳遞至執行緒,以及等候執行緒結束的方法。 若要使用此類別,請執行下列動作:

  • CAMThread 衍生類別,並覆寫純虛擬方法 CAMThread::ThreadProc。 這個方法是線上程開頭呼叫的執行緒程式。
  • 在您的應用程式中,建立衍生類別的實例。 建立 物件不會建立執行緒。 若要建立執行緒,請呼叫 CAMThread::Create 方法。
  • 若要將要求傳送至執行緒,請呼叫 CAMThread::CallWorker 方法。 這個方法會採用 DWORD 參數,其意義是由類別所定義。 方法會封鎖直到執行緒回應 (如下所示) 。
  • 在您的執行緒程式中,呼叫 CAMThread::GetRequestCAMThread::CheckRequest來回應要求。 GetRequest 方法會封鎖,直到另一個執行緒呼叫 CallWorker 為止。 CheckRequest 方法是非封鎖方法,可讓執行緒在非同步運作時檢查是否有新要求。
  • 當執行緒收到要求時,請呼叫 CAMThread::Reply 以解除封鎖呼叫執行緒。 Reply 方法會採用 DWORD 參數,它會傳遞至呼叫執行緒作為 CallWorker 的傳回值。

當您完成執行緒時,請呼叫 CAMThread::Close 方法。 此方法會等候執行緒結束,然後關閉執行緒控制碼。 您的 ThreadProc 訊息必須保證會自行結束,或回應 CallWorker 要求。 解構函式方法也會呼叫 Close。

下列範例說明下列步驟:

class MyThread : public CAMThread
{
protected:
    DWORD ThreadProc(void);
};

DWORD MyThread::ThreadProc()
{
    BOOL bShutDown = FALSE;
    while (!bShutDown)
    {
        DWORD req = GetRequest();
        printf("Request: %d\n", req);
        bShutDown = (req == 0);
        Reply(bShutDown ? S_FALSE : S_OK);
    }
    printf("Quitting Thread\n");
    return 1;
}

void main()
{
    MyThread thread;
    DWORD reply;
    
    thread.Create();
    reply = thread.CallWorker(3);
    reply = thread.CallWorker(0); // Thread exits.
}

在衍生類別中,您也可以定義成員函式,以驗證 CallWorker 的參數。 下列範例顯示執行此動作的一般方式:

enum Command {CMD_INIT, CMD_RUN, CMD_STOP, CMD_EXIT};

HRESULT Init(void)  { return CallWorker(CMD_INIT); }
HRESULT Run(void)   { return CallWorker(CMD_RUN); }
HRESULT Stop(void)  { return CallWorker(CMD_STOP); }
HRESULT Exit(void)  { return CallWorker(CMD_EXIT); }

類別 CAMThread 提供兩個重要區段作為公用成員變數。 用來 CAMThread::m_AccessLock 鎖定其他執行緒存取的執行緒。 (例如,Create 和 CallWorker 方法會保存此鎖定,以序列化 thread.) 使用 CAMThread::m_WorkerLock 鎖定執行緒之間共用的資料。

規格需求

需求
標頭
Wxutil.h (包含 Streams.h)
程式庫
Strmbase.lib (零售組建) ;
Strmbasd.lib (偵錯組建)