当前位置: 首页 > news >正文

回调函数的使用:案例一:c语言简单信号与槽机制。

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、回调函数
    • 1.1 回调函数基本概念
    • 1.2 简单实现
  • 二、代码案例
    • 1.代码示例
  • 总结


前言

了解回调函数的基本概念,函数指针的使用、简单信号与槽的实现机制;


一、回调函数

1.1 回调函数基本概念

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

A “callback” is any function that is called by another function which takes the first function as a parameter。
也就是说,函数 F1 调用函数 F2 的时候,函数 F1 通过参数给 函数 F2 传递了另外一个函数 F3 的指针,在函数 F2 执行的过程中,函数F2 调用了函数 F3,这个动作就叫做回调(Callback),而先被当做指针传入、后面又被回调的函数 F3 就是回调函数。

在这里插入图片描述

1.2 简单实现

创建函数指针,指向指定函数。

void hanshus1()
{cout <<"my hanshus1"<<endl;
}int hanshus2(int)
{cout <<"my hanshus2"<<endl;return 0;
}void (*hanshu1)();
int (*hanshu2)(int);
int main()
{hanshu1 = hanshus1;hanshu1(); // 输出 " my hanshus1 "hanshu2 = hanshus2;hanshu2(2); // 输出 “my hanshus2”
}

二、代码案例

简单实现信号与槽机制:
参考代码:
https://blog.csdn.net/weixin_41374099/article/details/115687655

1.代码示例

代码如下(示例):

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;#define MAX_SLOT_FUNCTION 20  //一个信号最多连接的槽函数数 //一个函数可以被任意多个信号连接//槽函数类型
typedef void (*slot_t)();//信号类型
typedef struct _signal_t 
{slot_t slot[MAX_SLOT_FUNCTION];int count; //槽函数数量
}signal_t;//信号初始化
signal_t* signal();//添加槽函数
void connect(signal_t* _signal, slot_t _slot);//发射信号
void emit(signal_t* _signal);//销毁
void del(signal_t* _signal);//信号初始化
signal_t* signal() 
{signal_t* s = (signal_t*)malloc(sizeof(signal_t));s->count = 0;for (int i = 0; i < MAX_SLOT_FUNCTION; ++i) {s->slot[i] = NULL;}return s;
}//添加槽函数
void connect(signal_t* _signal, slot_t _slot)
{_signal->slot[_signal->count] = _slot;++_signal->count;
}//发射信号
void emit(signal_t* _signal) 
{for (int i = 0; i < _signal->count; ++i){slot_t  func = _signal->slot[i];if (func != NULL) // {func();}}
}//销毁
void del(signal_t* _signal) {for (int i = 0; i < _signal->count; ++i){_signal->slot[i] = NULL;}_signal->count = 0;free(_signal);
}//准备几个槽函数!!!
void setup()
{static int i = 0;printf("setup > 我被点击了%d次,啊啊啊啊\n", ++i);
}void draw() 
{static int i = 0;printf("draw > 我被点击了%d次,啊啊啊啊\n", ++i);
}void loop()
{static int i = 0;printf("loop > 我被点击了%d次,啊啊啊啊\n", ++i);
}void test() 
{//自定义信号signal_t* clicked = signal();signal_t* moved = signal();connect(clicked, setup);connect(clicked, draw);connect(clicked, loop);connect(moved, setup);connect(moved, draw);//发射信号printf("---------------------------------------\n");emit(clicked);emit(clicked);printf("---------------------------------------\n");emit(moved);emit(moved);emit(moved);printf("---------------------------------------\n");emit(clicked);emit(clicked);emit(clicked);printf("---------------------------------------\n");}
int main()
{test();return 0;
}

运行截图:
在这里插入图片描述


总结

  • 回调函数和普通函数的区别;
  • 函数指针的使用
  • 信号与槽的机制
http://www.lryc.cn/news/95726.html

相关文章:

  • python matplotlib库 设置字体字号等
  • 【MySQL】SQL性能分析 (七)
  • 超越想象的GPT医疗 20230723
  • 【N32L40X】学习笔记03-gpio输出库
  • WebClient,HTTP Interface远程调用阿里云API
  • 飞书ChatGPT机器人 – 打造智能问答助手实现无障碍交流
  • React、Vue框架如何实现组件更新,原理是什么?
  • 常见面试题之设计模式--策略模式
  • redis多key问题
  • kafka第三课-可视化工具、生产环境问题总结以及性能优化
  • 2_Apollo4BlueLite中断控制器NVIC
  • WAIC2023:图像内容安全黑科技助力可信AI发展
  • 微信小程序quickstartFunctions中云函数的应用
  • Go学习 2、程序结构
  • SpringBoot整合JavaMail
  • Spring6——入门
  • 【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)
  • 为什么需要GP(Global Platform)认证?
  • eclipse 格式化代码 快捷键
  • 深入探索Socks5代理与网络安全
  • 【NLP】如何使用Hugging-Face-Pipelines?
  • 网络安全(黑客)自学笔记
  • spring数据校验
  • 因材施教,有道发布“子曰”教育大模型,落地虚拟人口语教练等六大应用
  • golang waitgroup
  • 单列模式多学两遍
  • Spring Cloud【SkyWalking网络钩子Webhooks、SkyWalking钉钉告警、SkyWalking邮件告警】(十六)
  • 【力扣每日一题】2023.7.25 将数组和减半的最少操作次数
  • Docker-Compose 轻松搭建 Grafana+InfluxDb 实用 Jmeter 监控面板
  • 异构线程池的c++实现方案