如何实现类的成员函数创建线程

class CMySocket
{
  public:
  DWORD WINAPI WorkThread(LPVOID CompletetionPortID);
  ...
};

  有如上类,在类中某函数想以函数(WorkThread)

  CreateThread(NULL, 0, WorkThread, &param, 0, &ThreadID))

  编译会报错:cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)' None of the functions with this name in scope match the target type

  
解决方法:

  1.

  这种情况,一般是将线程函数申明为静态,如:

class CRealtimeTask
{
  public:
  static UINT taskmain(LPVOID param);
  BOOL StartTask();
};

  在类中定义的成员函数,VC在编译时会强加一个this指针,所以才会出现上边的情况.将该成员函数声明为static类型,可以将this指针除去,但static成员函数只能访问static成员.

  

    2.

  以将线程函数申明成友员函数,这样可以传入该类的指针,访问类的成员; 

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);
}


  3.

  可以对成员函数实现回调,并访问非静态成员的,如下所示,这是为了实现线程函数访问类成员而实现的类.比MFC的实现方法好象要好一点.

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);
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值