zoukankan      html  css  js  c++  java
  • 类的成员函数实现线程的回调函数

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

    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 ;
    }
  • 相关阅读:
    [UE4]roll pitch yaw
    [UE4]用向量表示方向
    [UE4]关闭自动曝光
    Mysql数据库常用分库和分表方式
    mycat分库分表 mod-long
    windows安装mycat(转)
    Mycat读写分离、主从切换学习(转)
    Windows版Mycat结合mysql安装配置+水平切分(转载)
    数据库高性能读写分离集群操作说明
    spring MVC、mybatis配置读写分离,ReplicationDriver(转载)
  • 原文地址:https://www.cnblogs.com/techdreaming/p/5699892.html
Copyright © 2011-2022 走看看