之前做了很多关于上位机下位机通信的业务以及测试,有很多这样的场景:上位机需要下位的数据然后处理保存,我以什么样的方式获得呢?
1、我上位机每隔多少时间主动去读取。
2、我订阅下位机的数据,当数据改变等满足我的订阅条件时,主动向我发送数据,并且调用我给的回调函数。
第一种情况可能存在很多不必要的访问,比较浪费资源,在我的业务中非常适合订阅回调类似的机制,让其主动通知上位机。
回调函数
以C为例,学习学习回调函数的用处。回调函数的机制就是把回调函数的指针作为参数传递给调用函数,在调用函数中再把数据传递给回调函数执行回调函数。以下代码为例。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <pthread.h>
// 回调函数类型
typedef int (*callback_func)(int,int);
typedef struct
{
callback_func back;
}callbackHandle;
// 全局结构体
callbackHandle gloalCallHandle;
// 注册回调函数
void registerCallback(callback_func func)
{
gloalCallHandle.back = func;
}
// 执行回调函数的调用函数
void perfor(int a,int b)
{
int max_num = gloalCallHandle.back(a,b);
printf("max num is:%d",max_num);
}
//回调函数比较大小
int max(int a,int b)
{
return a > b ? a : b;
}
//模拟消息收到函数
void* sockerec(void* arg)
{
int a = 869,b = 569;
sleep(2);
perfor(a,b);
return NULL;
}
int main(void)
{
// 注册回调函数
registerCallback(max);
pthread_t thread;
pthread_create(&thread,NULL,&sockerec,NULL);
pthread_join(thread,NULL);
return 0;
}
上述代码模拟了在回调函数max里比较接收到的a,b数据的大小。使用registerCallback注册一个回调函数,当数据到达sockerec执行调用函数perfor,perfor调用函数将接收到的a,b值传给max执行max函数。
发布-订阅模式
发布订阅模式是非常常见的消息传递机制,其中包括生产者,消费者,消息中心。回调函数在其中有很重要的作用。
生产者:负责创建和发布消息到消息中心的实体。
消费者:接收消息中心转发的消息的实体,并且向消息中心订阅感兴趣的主题,提供一个回调函数在接收到消息的时候被调用。
消息中心:消息转发的中介,接收生产者发布的消息,根据主题转发给消费者,消息达到时调用消费者的回调函数。
回调函数:消费者提供,消息中心把消息作为参数传递给回调函数,调用执行,在回调函数里可以实现自己要处理消息的一些逻辑。
回调函数在某些异步操作,事件驱动,模块化和解耦等应用广泛,总之回调函数是一种很好用的机制。