CAMThread 类
[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayer、 IMFMediaEngine 和 Media Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayer、 IMFMediaEngine 和 音频/视频捕获 ,而不是 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::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 方法持有此锁以序列化线程上的操作。) 使用 CAMThread::m_WorkerLock 锁定线程之间共享的数据。
要求
要求 | 值 |
---|---|
标头 |
|
库 |
|