一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

注册回调的作用

  在设计模式中注册回调的方式叫做回调模式。在SDK开发中,为增强开发者的SDK通用性,排序或者一些算法逻辑需要使用者进行编写。这时候就需要向SDK传递回调函数。
注册回调能使下层主动与上层通信。从而避免了上层不停询问下层的模式。

注册回调的流程

  SDK的接口会提供一个注册回调函数,来规范回调函数的格式,如返回值,参数等。使用者编写一个固定格式的回调函数,来调用SDK提供的注册回调函数。当然,在c中注册回调的实现方式是通过函数指针,在c++中可以通过function和bind实现。

例1

  这是一个简单的函数调用,假设print()是sdk中的api,我们直接使用时候。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 void print(string str);
 5 //----------使用者模块-----------------
 6 int main()
 7 {
 8     print("hello word");
 9     system("pause");
10     return 0;
11 }
12 //----------SDK模块-----------------
13 void print(string str)
14 {
15     printf(str.c_str());
16 } 

例子2

  这次使用函数指针,来间接调用

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 void print(string str);
 5 //----------使用者模块-----------------
 6 int main()
 7 {
 8     void(*p) (string str);
 9     p = print;
10     p("hello word");
11     system("pause");
12     return 0;
13 }
14 //----------SDK模块-----------------
15 void print(string str)
16 {
17     printf(str.c_str());
18 }

例子3

这就是一个简单的回调模式。sdk提供注册回调函数,使用者提供回调函数。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 typedef void(*P)(string s);         //使用函数指针通常先typedef
 5 P p = nullptr;                      //sdk模块创建函数指针对象
 6 void print(string str);             //使用者模块创建回调函数
 7 void print_test(string, P p);       //注册回调函数
 8 //----------使用者模块-----------------
 9 int main()
10 {
11     print_test("hello word", print);
12     system("pause");
13     return 0;
14 }
15 //----------回调函数----------
16 void print(string str)
17 {
18     printf(str.c_str());
19     printf("随便写");
20 }
21 //----------SDK模块-----------------
22 void print_test(string str, P prin)//注册回调函数
23 {
24     p = prin;
25     p(str);
26 }

例子4

  当然 在实际使用中,与上层通信的函数是常常放在一个线程循环中,等待事件响应,所以通信的函数是不能和注册函数写在一起,不能在通信函数中传入函数指针。需要单独注册。

 1 //sdk.h
 2 typedef void(*REC_CALLBACK)(long,char *,char *,char *);//调用函数格式
 3 REC_CALLBACK record_callback;//创建实例
 4 //.cpp
 5 int register_callback(REC_CALLBACK P)//注册回调函数
 6 {
 7     rec_callback = P;
 8     rec_callback_state = true;
 9     return 0;
10 }
11  
12 init_record()
13 {
14 while(true)
15 {
16   ..........
17 if (rec_callback1_state==true)
18     {
19         rec_callback(card, time, card_io, state);//调用回调函数
20     }
21 else
22     {
23     }
24 }
25 }

使用者模块

 1 print(long,char *,char *,char *)//回调函数
 2 {
 3    printf("xxxxx"long ,char......);
 4 }
 5  
 6 int main()
 7 {
 8     register_callback(print)//使用前先注册
 9     std::thread t1(init_record);
10     t1.join();
11  
12 }

 

posted on 2022-08-09 15:18  一杯清酒邀明月  阅读(1577)  评论(0编辑  收藏  举报