注册回调的作用

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

注册回调的流程

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

例1

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

#include<iostream>
#include<cstdio>
using namespace std;
void print(string str);
//----------使用者模块-----------------
int main()
{
print("hello word");
system("pause");
return 0;
}
//----------SDK模块-----------------
void print(string str)
{
printf(str.c_str());
} 

例子2

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

#include<iostream>
#include<cstdio>
using namespace std;
void print(string str);
//----------使用者模块-----------------
int main()
{
void(*p) (string str);
p = print;
p("hello word");
system("pause");
return 0;
}
//----------SDK模块-----------------
void print(string str)
{
printf(str.c_str());
}

  

例子3

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

#include<iostream>
#include<cstdio>
using namespace std;
typedef void(*P)(string s); //使用函数指针通常先typedef
P p = nullptr; //sdk模块创建函数指针对象
void print(string str); //使用者模块创建回调函数
void print_test(string, P p); //注册回调函数
//----------使用者模块-----------------
int main()
{
print_test("hello word", print);
system("pause");
return 0;
}
//----------回调函数----------
void print(string str)
{
printf(str.c_str());
printf("随便写");
}
//----------SDK模块-----------------
void print_test(string str, P prin)//注册回调函数
{
p = prin;
p(str);
}

  

例子4

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

//sdk.h
typedef void(*REC_CALLBACK)(long,char *,char *,char *);//调用函数格式
REC_CALLBACK record_callback;//创建实例
//.cpp
int register_callback(REC_CALLBACK P)//注册回调函数
{
rec_callback = P;
rec_callback_state = true;
return 0;
} init_record()
{
while(true)
{
..........
if (rec_callback1_state==true)
{
rec_callback(card, time, card_io, state);//调用回调函数
}
else
{
}
}
}

  使用者模块

print(long,char *,char *,char *)//回调函数
{
printf("xxxxx"long ,char......);
} int main()
{
register_callback(print)//使用前先注册
std::thread t1(init_record);
t1.join(); }

  

C++的注册和回调的更多相关文章

  1. 遍历注册表回调函数(仿PCHunter CmpBack)

    遍历注册表回调函数(仿PCHunter CmpBack) typedef struct _CAPTURE_REGISTRY_MANAGER { PDEVICE_OBJECT deviceObject; ...

  2. Win64 驱动内核编程-32.枚举与删除注册表回调

    枚举与删除注册表回调 注册表回调是一个监控注册表读写的回调,它的效果非常明显,一个回调能实现在SSDT 上 HOOK 十几个 API 的效果.部分游戏保护还会在注册表回调上做功夫,监控 service ...

  3. 驱动开发:内核枚举Registry注册表回调

    在笔者上一篇文章<驱动开发:内核枚举LoadImage映像回调>中LyShark教大家实现了枚举系统回调中的LoadImage通知消息,本章将实现对Registry注册表通知消息的枚举,与 ...

  4. 驱动开发:内核监控Register注册表回调

    在笔者前一篇文章<驱动开发:内核枚举Registry注册表回调>中实现了对注册表的枚举,本章将实现对注册表的监控,不同于32位系统在64位系统中,微软为我们提供了两个针对注册表的专用内核监 ...

  5. 如何在Room框架下注册onUpgrade回调及自定义DatabaseErrorHandler

      在 Android 中,Room 为 SQLite 提供了高效稳定的抽象层,简化开发流程.RoomDatabase.java 是初始化数据库的重要构建组件,通过它我们可以添加RoomDatabas ...

  6. OpenGL的GLUT注册回调函数[转]

    OpenGL的注册回调函数 void glutDisplayFunc(void (*func)(void) ); 为当前窗口设置显示回调函数 void glutOverlayDisplayFunc(v ...

  7. android aidl通信 RemoteCallbackList客户端注册回调

    RemoteCallbackList 声明 public class RemoteCallbackList<E extends IInterface> 情况 在AIDL中客户端向服务端注册 ...

  8. 计算机基础,Python - 回调函数,使用装饰器注册回调函数

    1. 参考: https://en.wikipedia.org/wiki/Callback_(computer_programming) https://developer.mozilla.org/e ...

  9. Win64 驱动内核编程-15.回调监控注册表

    回调监控注册表 在 WIN32 平台上,监控注册表的手段通常是 SSDT HOOK.不过用 SSDT HOOK 的方式监控注册表实在是太麻烦了,要 HOOK 一大堆函数,还要处理一些 NT6 系统有而 ...

随机推荐

  1. acm数论之旅--组合数(转载)

    随笔 - 20  文章 - 0  评论 - 73 ACM数论之旅8---组合数(组合大法好(,,• ₃ •,,) )  补充:全错排公式:https://blog.csdn.net/Carey_Lu/ ...

  2. vue 每20秒刷新1次接口的实现方法

    实现代码: setInterval(() => { setTimeout(fun, ) }, ) 备注: setInterval 放在内层 长时间会影响性能,造成页面卡顿甚至崩溃, 内层配合se ...

  3. 消息队列(四)--- RocketMQ-消息发送

    概述 RocketMQ 发送普通消息有三种 可靠同步发送 可靠异步发送 单向(oneway)发送 :只管发送,直接返回,不等待消息服务器的结果,也不注册回调函数,简单地说,就是只管发,不管信息是否发送 ...

  4. dp(小猪存钱罐)

                      B - Piggy-Bank 在acm能够做任何事情之前, 必须编制预算并获得必要的财政支持.这一行动的主要收入来自IBM.这个想法其实很简单,每当一些会员有一点小 ...

  5. 【MySQL】外键的变种

    " 目录 三种关系 多对一 多对多 一对一 因为有foreign key的约束,使得两张表形成了三种关系: 多对一 多对多 一对多 重点理解如何找出两张表之间的关系 现在有A.B两张表 分析 ...

  6. Vue-表单提交

    template <form @submit.prevent="submitFrom"> <!-- 注册提交事件 .prevent 阻止表单的默认提交行为 --& ...

  7. 批量导出存储在msdb库的SSIS包

    http://blog.51cto.com/ultrasql/1924464 use msdb go IF OBJECT_ID('msdb.dbo.usp_ExportSSISPkgs') IS NO ...

  8. 从头学pytorch(五) 多层感知机及其实现

    多层感知机 上图所示的多层感知机中,输入和输出个数分别为4和3,中间的隐藏层中包含了5个隐藏单元(hidden unit).由于输入层不涉及计算,图3.3中的多层感知机的层数为2.由图3.3可见,隐藏 ...

  9. python3实现在二叉树中找出和为某一值的所有路径

    在二叉树中找出和为某一值的所有路径请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径.规则如下:1.从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设 ...

  10. 使用scrapy-redis 搭建分布式爬虫环境

    scrapy-redis 简介 scrapy-redis 是 scrapy 框架基于 redis 数据库的组件,用于 scraoy 项目的分布式开发和部署. 有如下特征: 分布式爬取: 你可以启动多个 ...