本文要解決的問題很好描述,但要想取個對應的標題還真不容易。
任務描述:假設我有一個邏輯線程,這個線程專門用來處理 各種類成員函數的調用。
要求:類類型不限,類成員函數參數類型可以任意。
首先為這些成員函數定義一個基類
class Task
{
public:
virtual void Run() = 0;
};
其次,抽象出各類的成員函數參數類型,下面以一個參數為例
template <class T,class Method,class A>
class Task1 : public Task
{
private:
T* obj; Method method; A arg;
public:
Task1(T* t, Method m, const A &a){ obj = t; method = m; arg = a; }
protected:
virtual void Run(){ (obj->*method)(arg); }
};
為了方便線程操作,再抽象出一個專用的函數
template <class T,class Method,class A>
Task* NewTask(T* t,Method m,A &a)
{
return new Task1<T,Method,A>(t, m, a);
}
如何在線程中應用呢?這個很簡單,在線程中定義一個deque,每次調用NewTask函數往隊列中插入一個Task,線程函數每次從deque中取出一個Task然後執行其Run方法即可。
下面做一個簡單的測試(不是線程)
class JTest
{
public:
void f1(int c)
{
cout<<"arg: "<<c<<endl;
}
void test()
{
int c = 5;
Task* t = NewTask(this, &JTest::f1, c);
t->Run();
delete t;
}
};