非静态类成员作为线程函数

Win32API下,非静态的类成员是不能作为线程函数的,主要原因是this指针.
有些情况必须使用线程,例如主线程给用户一个友好的界面工作线程进行网络操作.
当你必须要新建线程执行类成员的时候就不得不妥协使用静态类成员,全局函数或友元.这样的类非常丑.
网上有些解决方案,例如: < 把C++类成员方法直接作为线程回调函数>

我的用的方法不一定比上面的方法好,不过我比较喜欢. 我的办法是增加一个静态类成员,和一个枚举,每次启动线程都调用这个静态成员,静态成员通过枚举判断应该执行哪个非静态成员. 下面是例子:

class Human{
private:
	unsigned _Age;
	// ......
public:
	struct structCry{ unsigned _uVol;
			  structCry( unsigned uVol ){ _uVol=uVol; } 
	};// 在ThreadProc中调用Cry时
	void Cry( unsigned uVol );

	//
	enum enumWhichFunc { Func_Cry };
	struct structThreadProc{
		Human* _pThis;             // 对象指针
		enumWhichFunc _eWhichFunc; // 枚举,调哪个类成员
		void* _pArgList;           // 类成员的参数
		structThreadProc( Human* pThis, enumWhichFunc eWhichFunc, void* pArgList){
			_pThis      = pThis;
			_eWhichFunc = eWhichFunc;
			_pArgList   = pArgList;
		}
	};
	static unsigned __stdcall ThreadProc( void*p );
};

void Human::Cry( unsigned uVol )
{
	AfxMessageBox("Human::Cry");
}

unsigned __stdcall Human::ThreadProc( void*p )
{
	ASSERT( p );

	structThreadProc* pThreadProcAgrList = (structThreadProc*)p;
	Human* pGuy = pThreadProcAgrList->_pThis;
	ASSERT( pGuy );

	if( Func_Cry==pThreadProcAgrList->_eWhichFunc ){
		structCry* pCryArgList = (structCry*)pThreadProcAgrList->_pArgList;
		pGuy->Cry( pCryArgList->_uVol );
	}

	return 0;
}

void CDemoDlg::OnOK() 
{
	Human guy;
	Human::structCry CryArgList(15);  // Human::Cry的参数
	Human::structThreadProc ThreadArgList( &guy, Human::Func_Cry, &CryArgList ); // Human::ThreadProc的参数

	_beginthreadex( NULL, 0, Human::ThreadProc, (void*)&ThreadArgList, 0, NULL );
}
  
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值