CAMThread 類別
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 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::GetRequest 或 CAMThread::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 鎖定執行緒之間共用的資料。
規格需求
需求 | 值 |
---|---|
標頭 |
|
程式庫 |
|