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

news/2024/12/22 23:55:00/

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、回调函数
    • 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.ppmy.cn/news/987680.html

相关文章

【PGMPY】 1. DAG基础结构

pgmpy 贝叶斯网络的纯python实现&#xff0c; 用途&#xff1a; 结构学习、 参数估计、 近似&#xff08;基于采样&#xff09; 精确推理 因果推理 安装 pip install pgmpyconda install -c ankurankan pgmpyconda install -c ankurankan pgmpy文档 https://pgmpy.org/index…

libuv库学习笔记-basics_of_libuv

Basics of libuv libuv强制使用异步和事件驱动的编程风格。它的核心工作是提供一个event-loop&#xff0c;还有基于I/O和其它事件通知的回调函数。libuv还提供了一些核心工具&#xff0c;例如定时器&#xff0c;非阻塞的网络支持&#xff0c;异步文件系统访问&#xff0c;子进…

如何从 Python 调用C++

一、说明 Python是一种高级编程语言,它可以调用其他语言编写的函数。在 Python 中调用 C 函数的方法有两种:1)使用 Python 提供的 ctypes 库;2)使用 Python 提供的 Cython 库。 注意:您可以在此存储库中下载此示例的完整代码。如果您对本文有任何意见,可…

MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库,对MySQL数据库的简单操作,MySQL的外接应用程序使用说明

系列文章目录 MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库&#xff0c;对MySQL数据库的简单操作&#xff0c;MySQL的外接应用程序使用说明 MySQL笔记——表的分组查询、表的分页查询、表的约束、数据库设计 MySQL案例——多表查询以及嵌套查询 MySQL笔记—…

建木-自动化部署-dockerfile文件书写-自动化部署jar包完成docker运行镜像-dockerfile书写介绍

阿丹&#xff1a; 在自动化部署的时候jar包要如何进行部署。就需要通过使用书写dockerfile文件来进行触发的时候执行docker指令来完成镜像的部署以及运行。 什么是dockerFile dockerfile是自定义镜像的一套规则dockerfie由多条指令构成&#xff0c;Dockerfile中的每一条指令都…

解决mysqld服务启动失败

1、进程 首先查看下mysql进程: ps -aux | grep mysql有进程号 2、所有者和所属组为mysql 查看/usr/local/MySQL/data/mysqld.pid所有者和所属组是否为mysql 原来是权限有问题&#xff0c;那么更改权限&#xff08;还需要加权限&#xff09;3、 重新启动服务

【设计模式——学习笔记】23种设计模式——外观模式Facade(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入介绍基本介绍类图出场角色 案例实现案例一类图代码实现 案例二类图代码实现 外观模式在Mybatis源码中的应用总结文章说明 案例引入 在家庭影院中&#xff0c;要享受一场电影&#xff0c;需要如下步骤&#xff1a; 直接用遥控器&#xff1a;统筹各设备开关开…

vue2项目迁移到vue3中的改动——基础积累

最近在跟着大神学习vue3的内容&#xff0c;发现之前vue2写的代码可以直接照搬到vue3中&#xff0c;但是有一些需要改动的内容&#xff0c;下面做一下记录。 1.定义对象时&#xff0c;需要指定每个属性值 例如&#xff1a;listQuery:{} 如果使用&#xff1a;listQuery.Filter…