上一篇文章寫了一個好的線程控制類要具備的幾個要點並給出線程控制類的接口,細心的程序猿可以看出,無法輕松繼承上面的接口,聲明一個線程對象,也無法調用線程類的成員函數。同樣一個類中可以有好幾個線程,分別作不同的工作,調用不同的成員函數。所以還要寫一段代碼來實現一個繼承類且容易調用線程類的線程函數。
在這裡,我就不賣關子了,我先把我寫好的繼承類寫出來
//---------------------------------------------------------------------------
#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;
};
所以通過上面的宏,可以方便創建線程類及線程對象並調用類中的成員函數。
本文出自 “阿木雪” 博客,謝絕轉載!