//==============================================================================================
// 回调函数常用于对异步事件的处理.
// 对异步事件的处理,首先将异步事件发生时需要执行的代码编写成一个函数,并将该函数注册成为
// 回调函数,这样当该异步事件发生时,系统会自动调用事先注册好的回调函数.
// 回调函数的注册实际上就是将回调函数的信息填写到一个用于注册回调函数的结构体变量中。
// 当然各种不同异步事件的回调函数注册方法有所不同
//==============================================================================================
#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);
//==============================================================================================
回调函数例程
最新推荐文章于 2024-02-04 18:43:22 发布