类的成员函数实现线程的回调函数

  一般都是用静态函数作为线程的回调函数实现,但是总是感觉不是很顺畅,更改吧,就好像破坏了类的封装性,不改吧,访问实在是麻烦。所以,今天要做的就是让类的成员函数作为线程的回调函数存在,其中使用的一个比较特殊的结构就是

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 ;
}
原文地址:https://www.cnblogs.com/techdreaming/p/5699892.html