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