一、Sqlite3 回调函数理解
有上述内容我们就可以推导出回调函数执行的流程了:
-
主函数需要调用回调函数
-
中间函数登记回调函数
-
触发回调函数事件
-
调用回调函数
-
响应回调事件
- 下面举个例子:
比如你在美团上点了个外卖,并填写了电话号码,外卖员把快递送到楼下,打电话给你,然后你来取外卖。
在这个例子里,你的电话号码就叫回调函数
,填电话号码叫登记回调函数
,外卖送到指点地点叫做回调事件
,外卖员给你打电话叫做调用回调函数
,你到楼下去买卖叫做响应回调事件
。
回调方式有两种:同步回调和异步回调
- 同步回调是阻塞的,单个的线程需要等待结果的返回才能继续执行。就像你点了外卖,点完外卖之后要一直等,知道等到电话通知才去取外卖。
- 异步回调是,在同时指定一个函数,在异步任务完成时会自动的调用这个函数。就像你你点了外卖后可以先做自己的事情,看会动漫电影,然后外卖员打电话叫你再去取外卖。
下面的例子中回调函数有callback_1、callback_2、和一个call_test函数,中间函数是handel, 我们传给Handel的函数只要返回值与参数都是int型 就可以作为回调函数,就是这个声明: int Function(int)
代码实例:
#include <stdio.h>
int Callback_1(int a) ///< 回调函数1
{
printf("Hello, this is Callback_1: a = %d \n", a);
return 0;
}
int Callback_2(int b) ///< 回调函数2
{
printf("Hello, this is Callback_2: b = %d \n ", b);
return 0;
}
int call_test(int x)
{
printf("Hello, this is Callback test: c = %d \n ", x);
return 0;
}
int Handle(int x, int (*Callback)(int)) ///< 注意这里用到的函数指针定义
{
// do someing to triigger 触发事件
Callback(x);
}
int main()
{
Handle(4, Callback_1);
Handle(5, Callback_2);
Handle(15, call_test);
return 0;
}
运行结果:
lzl@ubuntu18:~/my/test/callback$ ./main
Hello, this is Callback_1: a = 4
Hello, this is Callback_2: b = 5
Hello, this is Callback test: c = 15
二、sqlite3_exec的回调函数 callback
callback函数原型:
typedef int(*sqlite_callback)(void* para, int columenCount, char** columnValue, char** columnName);
sqlite3中,这个回调函数我们自己定义,设定需要实现的功能。
-
para : 由sqlite3_exec传入的参数指针,或者说是指针参数
-
columnCount: 查询到的这一条记录由多少个字段(多少列)
-
columnValue : 该参数是双指针,查询出来的数据都保存在这里,它是一个1维数组,每一个元素都是一个char*,是一个字段内容,所以这个参数就可以不是单字节,而是可以为字符串等不定长度的数值,用字符串表示,以’\0’结尾
-
columnName : 该参数是双指针,语columnValue是对应的,表示这个字段的字段名称,