c++11 回調函數(以相機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方面的知識,可以暫時忽略,不影響對回調函數的理解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM