CAMThread 类

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 方法保存此锁,以序列化 thread.) 使用 CAMThread::m_WorkerLock 锁定线程之间共享的数据。

要求

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

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