回调函数例程

//==============================================================================================
// 回调函数常用于对异步事件的处理.
// 对异步事件的处理,首先将异步事件发生时需要执行的代码编写成一个函数,并将该函数注册成为
// 回调函数,这样当该异步事件发生时,系统会自动调用事先注册好的回调函数.
// 回调函数的注册实际上就是将回调函数的信息填写到一个用于注册回调函数的结构体变量中。
// 当然各种不同异步事件的回调函数注册方法有所不同
//==============================================================================================
#include <stdio.h>

// 定义函数指针类型
typedef void (* CalBakpFun)(void * p);

// 用于注册回调函数的结构体
typedef struct _cbDemo {
    CalBakpFun cb;                          // 指向回调函数的指针
    void * calbakParam;                     // 指向参数的指针
    int k;
} CalBakDemo;

//==============================================================================================
// 本函数用于注册回调函数
// 参  数: pDemo:用于注册回调函数的结构体
//         test:要注册的回调函数
//            p:回调函数被调用时使用的参数
//==============================================================================================
void RegisterCallback(CalBakDemo * pDemo, CalBakpFun test, void * p)
{
    pDemo->cb      = test;                 // 结构体的cb指向回调函数
    pDemo->calbakParam = p;                // 结构体的cbParam指向参数
}

// 结构体 Data 是该程序中用到的一个结构体数据类型,包含i、j两个整形成员变量
typedef  struct _Data {
    int i;
    int j;
} Data;

//==============================================================================================
// 作为回调函数的两个例子函数:Test1()和Test2()
//==============================================================================================
void Test1(void * p)
{
    ((Data *)p)->i++;
    ((Data *)p)->j++;
}

void Test2(void * p)
{
    ((CalBakDemo *)p)->k = 10;
}

//==============================================================================================
// 主函数
//==============================================================================================
int main(void)
{
    CalBakDemo demo;                        // 用于注册回调函数的结构体变量demo
    Data data;

    demo.k = 1;
    data.i = 10;
    data.j = 11;

    RegisterCallback(&demo, Test1, &data);  // 将Test1()注册为回调函数
    printf("%d, %d\n", data.i, data.j);
    demo.cb(demo.calbakParam);              // 通过demo.cb(demo.calbakParam)调用回调函数
    printf("%d, %d\n", data.i, data.j);

    RegisterCallback(&demo, Test2, &demo);  // 将Test2()注册为回调函数
    printf("%d\n", demo.k);
    demo.cb(demo.calbakParam);              // 通过demo.cb(demo.calbakParam)调用回调函数
    printf("%d\n", demo.k);

    return 0;
}

//==================================注册回调函数===============================================
// RegisterCallback( &demo, Test1, &data);
// 该语句将Test1()注册为回调函数,并且指定将来调用回调函数Tes1()时,
// 以data作为Test1()的参数;注册时将Test1()的地址和data的地址填入结构体变量demo中
// 注册 Test2() 函数时同理.

//==================================调用回调函数===============================================
//
// 调用回调函数时,都是从结构体变量demo取出回调函数的地址及参数来执行回调函数的,
// 因此,无论注册的回调函数和参数是什么,执行回调函数的方式是一样的:demo.cb(demo.calbakParam);
//==============================================================================================

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值