CAMThread 类

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

CAMThread 是用于管理工作线程的抽象类。

受保护的成员变量 说明
m_hThread 线程的句柄。
公共成员变量 说明
m_AccessLock 锁定线程不被其他线程访问的关键部分。
m_WorkerLock 锁定线程之间共享数据的关键部分。
公共方法 说明
CAMThread 构造函数方法。
~ CAMThread 析构函数方法。 虚拟。
InitialThreadProc 创建线程时调用 ThreadProc 方法。
创建 创建线程。
CallWorker 使用请求向线程发出信号。
关闭 等待线程退出,然后释放其资源。
ThreadExists 查询线程是否存在。
GetRequest 等待下一个请求。
CheckRequest 在不阻止的情况下检查是否存在请求。
答复 回复请求。
GetRequestHandle 检索由 CallWorker 方法发出信号的事件的句柄。
GetRequestParam 检索最新请求。
CoInitializeHelper 在线程开始时调用 CoInitializeEx。
纯虚拟方法 说明
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 方法持有此锁以序列化线程上的操作。) 使用 CAMThread::m_WorkerLock 锁定线程之间共享的数据。

要求

要求
标头
Wxutil.h (包括 Streams.h)

Strmbase.lib (零售版本) ;
Strmbasd.lib (调试生成)