为啥我都编译不过去。总是卡在pthis->*pfuc上,说->*这个符号有问题。 下面是原本的代码,我把明显有错误的,callback(改为callback{。把p1->base改成了p1->pThis。
网上很多地方都引用了这段代码。怎么我就编译不过去?
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);
}
网上很多地方都引用了这段代码。怎么我就编译不过去?
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);
}
在类里添加一个static DWORD WINAPI MyThreadPoc(LPVOID lpData)方法,然后你创建线程时直接使用这个方法作为执行函数就好了
void myCreateThread(const Base* const this,fnCallBack pfuc,void *param)derived p2;p2.myCreateThread(boost::bind(&(base::myCallBack),p,param));
差不多就可以了~~
依据我的知识水平,作为回调函数只能有两种,一种是全局函数(类似于C里面的函数),还有就是类的静态成员函数(因为非静态函数中有个this指针问题,所以不行)
改成
static DWORD callback myThreadfuc(LPVOID p)