问题描述
假设你有一个类,你想在后台线程上调用它的一些方法。这就是我感兴趣的,我认为 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 (将#修改为@)