一般都是用静态函数作为线程的回调函数实现,但是总是感觉不是很顺畅,更改吧,就好像破坏了类的封装性,不改吧,访问实在是麻烦。所以,今天要做的就是让类的成员函数作为线程的回调函数存在,其中使用的一个比较特殊的结构就是
union { void ( *ThreadProc)(LPVOID pvParam); void ( student::*MemberProc)(LPVOID pvParam); } Proc;
联合类,用于转换类成员方法指针到普通函数指针
下面是一个小李子,变量名 就凑活看吧,核心思想也是参考其他博文。练习下。
class student { public: student() { m_handle = NULL; name = "llil"; age = 13; } void printInfo(LPVOID pvParam); void startUp(); private: HANDLE m_handle; int age; string name; }; union { void ( *ThreadProc)(LPVOID pvParam); void ( student::*MemberProc)(LPVOID pvParam); } Proc; void student::printInfo(LPVOID pvParam) { student * pS = (student * )pvParam; while(true){ cout<<"age" <<pS->age<<endl; cout<<"name"<<pS->name<<endl; Sleep(2000); } } void student::startUp() { Proc.MemberProc = &student::printInfo; m_handle = CreateThread(NULL,0,LPTHREAD_START_ROUTINE(Proc.ThreadProc),this,0,0); } int _tmain(int argc, _TCHAR* argv[]) { student s1; s1.startUp(); system("pause"); _CrtDumpMemoryLeaks(); return 0; }
其中比较重要的就是必须要以 指针访问 类成员,否则虽然编译没问题,但是运行时会崩溃。出现内存无法访问等一些问题。很难发现
还有一种方法就是通过友元函数实现。
class student { public: student () { m_handle = NULL; name = "llil" ; age = 13 ; } friend UINT WINAPI printInfo( LPVOID pvParam); void startUp(); private: HANDLE m_handle ; int age; string name ; }; UINT WINAPI printInfo (LPVOID pvParam) { student * pS = (student * ) pvParam; while(true ){ cout <<"age" <<pS-> age<<endl ; cout <<"name"<< pS->name <<endl; Sleep (2000); } return 0 ; } void student:: startUp() { m_handle = CreateThread( NULL,0 ,(LPTHREAD_START_ROUTINE) printInfo,this ,0, 0); } int _tmain( int argc, _TCHAR* argv []) { student s1 ; s1 .startUp(); system ("pause"); _CrtDumpMemoryLeaks (); return 0 ; }
时间: 2024-10-26 23:44:48