ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c++11 回调函数(以相机SDK采集图像的方式进行讲解)

2021-07-06 01:33:09  阅读:370  来源: 互联网

标签:11 函数 frame c++ 相机 图像 fun 回调 SDK


回调函数引意

假设有AB两个类,B类是我们自己写的应用类,A类为第三方类相机类,如下!

在设计A类的时候,该类的设计者肯定想把相机采集到的图片实时传递给应用者(此时是我们B类),而我们B类在设计应用程序的时候也想实时获取到相机采集到的图片,那B类中该怎么做呢?第一想到的方法就

是一直死循环轮询A类对象调用相关成员函数获取到实时图像。这种方式无疑不造成一种资源的浪费,而且占用很大的CPU资源。

那么有没有一种方式,当只有A类采集到图像的时候才去通知B类去获取图像这样的方式呢?答案是有的,这就引出我们今天讨论的主题:回调函数!

回调函数主要过程就是:把B类的函数注册(传递函数指针)给 A类,当A类采集到图像,就调用刚注册进来的B类函数,这样就间接完成了,由A类去通知B类去做某事

由以上图可知,把B类的函数注册给了A类。

知道了回调函数的用意,接下来就是编写代码演示过程

此次演示,我们使用c++11标准来编写代码

代码演示

#include <iostream>
#include <functional>
using namespace std;

/*回调函数原型声明*/
typedef function<void(int)> CALLBACK;

/*相机SDK底层A类*/
class A_Camera
{
public:
	void regeditCallBack(CALLBACK fun)/*注册回调函数*/
	{
		_fun = fun;
	}

	void getFrame()/*内部获取图像函数(B类调用者不需要关心它什么时候会执行)*/
	{
		/*采集到一帧数据_frame*/
		/****内部操作***/
		/***内部操作***/

		_frame = rand() % 10;
		_fun(_frame);/*回传给B_My类*/
	}

private:
	int _frame;
	CALLBACK _fun;
};

/*应用层B类*/
class B_My
{
public:
	void callBackFun(int frame)/*获取到A类的图像,此时frame就是一帧数据*/
	{
		cout << "B类获取到一帧数据:" << frame << endl;
	}
};

int main(int argc, char **argv)
{
	/*声明应用层B类对象*/
	B_My B; 

	auto Fun = bind(&B_My::callBackFun, B, placeholders::_1);/*中转一下,利用C++11特性*/

	/*声明底层相机A类*/
	A_Camera camera;
	camera.regeditCallBack(Fun);/*把B类的方法注册给A类*/

	/*以下只是模拟A类内部触发获取到图片,一共模拟触发10次*/
	for (int i = 0; i < 10; ++i)
	{
		camera.getFrame();
	}

	return 0;
}



运行结果

总结

通过相机回调的方式,简单的对回调函数进行一次分析,第一次接触时回调函数机制会有点困难,但多看几遍心里就会有点感觉。例子涉及到c++11方面的知识,可以暂时忽略,不影响对回调函数的理解

标签:11,函数,frame,c++,相机,图像,fun,回调,SDK
来源: https://www.cnblogs.com/lvvou/p/14975054.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有