上一篇文章写了一个好的线程控制类要具备的几个要点并给出线程控制类的接口,细心的程序猿可以看出,无法轻松继承上面的接口,声明一个线程对象,也无法调用线程类的成员函数。同样一个类中可以有好几个线程,分别作不同的工作,调用不同的成员函数。所以还要写一段代码来实现一个继承类且容易调用线程类的线程函数。
在这里,我就不卖关子了,我先把我写好的继承类写出来
//---------------------------------------------------------------------------
#define CAsThread(classname,vFunc) \
class classname##vFunc:public _CAsThread \
{ \
protected: \
void WorkThread(void) \
{ \
if(0 != m_Owner) \
m_Owner->vFunc(); \
} \
public: \
classname* m_Owner; \
}; \
classname##vFunc
//---------------------------------------------------------------------------
这个继承类是用宏写好的,这样在程序的编译器,进行宏展开后,可以实现线程继承类与线程类及成员函数联系起来。我简要说明一个这个宏实现的功能。这个宏实现了一个类,这个类由一个类的名称(简称A)和函数(简称B)来组成,这个类继承了_CAsThread,并实现了WorkThread,在WorkThread函数中调用了A的成员函数B,最终实现调用类的成员函数。举个例子
class CTestThread
{
public:
void Test() //线程成员函数
{
printf("Helllo TestThread\n");
Sleep(1000);
}
public:
CAsThread(CTestThread, Test) m_Thread;
};
这个测试线程类经过宏展开会变成这个样子
class CTestThread
{
public:
void Test() //线程成员函数
{
printf("Helllo TestThread\n");
Sleep(1000);
}
public:
class CTestThreadTest
{
protected:
void WorkThread(void)
{
if(0 != m_Owner)
m_Owner->vFunc();
}
public:
CTestThread* m_Owner;
};
CTestThreadTest m_Thread;
};
所以通过上面的宏,可以方便创建线程类及线程对象并调用类中的成员函数。
转载于:https://blog.51cto.com/armsnow/1276236