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

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

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

类的成员函数实现线程的回调函数的相关文章

类内定义线程的回调函数问题

C++类成员函数使用时,都会隐式传递一个this指针给该函数,this指针指向该类的对象.函数体可以通过显示调用该指针或直接访问类内成员.      回调函数是用指针来调用的函数,最常使用的回调函数就是在创建线程时,以一个函数指针以及传递给这个函数多个参数来调用线程函数来创建线程.那么一般的类成员函数是不能用作回调函数的,因为库函数在使用回调函数时,都会传递指定的符合回调函数声明的的参数给回调函数,而类成员函数隐式包含一个this指针参数,所以把类成员函数当作回调函数编译时因为参数不匹配会出错.

什么叫CallBack函数,怎么用回调函数?

JQuery众多常用方法中很经常会用到回调函数, 理解好js callback函数定义及用法,我们就可以利用callback函数帮我们做很多事情啦! A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. 这是js对callback函数的解析,意思是:callback函数是一个以参数形式传递

js中的回调函数,什么是回调函数?

一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为函数实际上是一种对象,即是内置对象,它可以存储在变量中,通过参数传递给另一个函数,我们可以将它作为参数传递给另一个函数,到函数中执行,甚至执行后将它返回,它一直被"专业的程序员"看作是一种难懂的技术. 回调函数的英文解释为: A callback is a function that is passed as an arg

线程GIL锁 线程队列 回调函数

----------------------------------无法改变风向,可以调整风帆;无法左右天气,可以调整心情.如果事情无法改变,那就去改变观念. # # ------------------------------------------------------------------------------------------------------------# # # --------------[线程队列]-------------- # import queue #先

设计一个函数,它接受不定数量的参数,这是参数都是函数。这些函数都接受一个回调函数作为参数,按照回调函数被调用的顺序返回函数名

function acceptFuncs() { var fnNames = []; //定义数组字面量,用来保存函数名称 for (var i = 0; i < arguments.length; i++) { //for循环检测接收到的每个参数是否为函数,是则传递回调函数给它,最后所结果压入数组中 if (typeof arguments[i] === "function") { fnNames.push(arguments[i](callback)); } } for (v

STM32 HAL库的定时器中断回调函数跟串口中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { //添加回调后的程序逻辑 if (htim->Instance == htim2.Instance) //判断是否定时器2 { } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { //添加回调后的程序逻辑 if(huart->Instance == USART1) //判断是否串口1 { } } 中断

类成员函数可以为回调函数吗

关于类成员函数是否可以成为回调函数,我们首先需要明确几个定义,1. 什么是回调函数 2. 为什么要使用回调函数 3. 调用普通类成员函数和调用回调函数有什么区别 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数 为什么要使用回调函数? 因为可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型.某些限制条件(如返回值为int

C++中类成员函数作为回调函数

注:与tr1::function对象结合使用,能获得更好的效果,详情见http://blog.csdn.net/this_capslock/article/details/38564719 回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自身的指针给其成员函数从

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静