如何使用 CThreadPool

问题描述

假设你有一个类,你想在后台线程上调用它的一些方法。这就是我感兴趣的,我认为 CThreadPool 将是一个很好的选择。我想知道之前是否有人使用 CThreadPool 进行方法调用。

这就是我设置的。基于来自 Microsoft 的 this 示例,我创建了一个抽象的“任务”类(我将其表示为接口)以及一个工作类:

class ITask
{
public:
    virtual void DoTask(LPVOID,LPOVERLAPPED) = 0;
};

class CWorker
{
public:
    typedef DWORD_PTR RequestType;

    BOOL Initialize(LPVOID)
    {
        return TRUE;
    }

    void Execute(RequestType dw,LPVOID pvParam,LPOVERLAPPED pOverlapped) throw()
    {
        ITask* pTask = (ITask*)(DWORD_PTR)dw;
        pTask->DoTask(pvParam,pOverlapped);
    }

    void Terminate(LPVOID)
    {
    }
};

然后在我的主要课程中,我基本上是这样做的:

class MyClass
{
public:
    MyClass()
    {
        m_threadpool.Initialize(this,NUM_OF_THREADS_DESIRED);
    }
    ~MyClass()
    {
        m_threadpool.Shutdown();
    }

private:
    CThreadPool<CWorker> m_threadpool;
    
    class : public ITask
    {
    public:
        void DoTask(LPVOID pvParam,LPOVERLAPPED)
        {
            MyClass* pObj = (MyClass*)pvParam;
            pObj->MethodToCallOnBackgroundThread();
        }
    } m_task;

    void MethodForQueuing()
    {
        m_threadpool.QueueRequest((CWorker::RequestType)&m_task);
    }

    void MethodToCallOnBackgroundThread()
    {
        // Do something
    }
};

这似乎有效。一个缺点是它需要为您想要使用线程池的每个方法声明一个新的 ITask 派生类,但这显然是 Microsoft 示例的工作方式。我想另一种方法是创建一个更通用的任务对象,然后传入一个枚举或其他东西,它可以用于类方法中的 switch 语句。无论如何,有没有人处理过这种情况,如果有,您有什么意见吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)