A回答:
這種情況,一般是將線程函數(shù)申明為靜態(tài),如:
class CRealtimeTask
{
public:
static UINT taskmain(LPVOID param);
BOOL StartTask();
};
KakuSun的意見:
您在類中定義的成員函數(shù),VC在編譯時會強加一個this指針,所以才會出現(xiàn)您所說的情況。將該成員函數(shù)聲明為static類型,可以將this指針除去,但static成員函數(shù)只能訪問static成員。
karymay的意見:
可以對成員函數(shù)實現(xiàn)回調,并訪問非靜態(tài)成員的,如下所示,這是我自己為了實現(xiàn)線程函數(shù)訪問類成員而實現(xiàn)的類。比MFC的實現(xiàn)方法好象要好一點。
class base;
typedef int (base::*fnCallBack)(void *p);
struct callback(void *param;fnCallBack *pfuc;base *pThis;};
class base{
static int myThreadfuc(void *p){
struct callback *p1=(struct callback *)p;
base *pthis=p1->base;fnCallBack *pfuc=p1->pfuc;void *param=p1->param;
int i=(pthis->*pfuc)(param);delete p;
return i;
}
public:
void myCreateThread(fnCallBack pfuc,void *param){
struct callback *p=new struct callback;
p.param=param;p.pThis=this;p.pfuc=pfuc;
::CreateThread(myThreadfuc,p);
}
virtual int myCallBack(void *p){printf("It's base class.\n");return 0;}
};
class derived:public base{
int myCallBack(void *p){printf("It's derived class\n");}
};
void myCreateThreadImitate(fnCallBack fuc,void *p)
{
(*fuc)(p);
}
void main()
{
base p;char *param;
p.myCreateThread(&(base::myCallBack),param);
derived p2;p2.myCreateThread(&(base::myCallBack),param);
}
//my callback address:karymay@163.net
ninjax的意見:
其實用靜態(tài)成員函數(shù)做線程函數(shù)還不錯,可以在調用函數(shù)時用param傳入this指針,然后在線程函數(shù)中用類型轉換轉換成指向該類的指針,這時該指針就可以訪問非靜態(tài)變量和私有變量了。
Ken的意見:
以將線程函數(shù)申明成友員函數(shù),這樣可以傳入該類的指針,訪問類的成員;
class CRealtimeTask
{
public:
friend UINT taskmain(LPVOID param);
BOOL StartTask();
};
UINT taskmain(LPVOID param)
{
CRealtimeTask * pTaskMain = (CRealtimeTask *) param;
//通過pTaskMain指針引用。
return TRUE;
}
BOOL CRealtimeTask::StartTask()
{
AfxBeginThread(taskmain,this);
}