什麼是Callback function?
如果在程式中使用某個
function, 我們可稱作
”call” function,這種行為是主動的
, 而
callback function是被動的
, 也就是當特定事件發生時
(例如觸控發生
, 或某手勢被偵測
),
callback function才會被呼叫
.
而Callback在C/C++實現的方式, 就是利用function pointer(函式指標), 例如A程式想要B程式發生某些事件時, 能通知A程式. 利用Callback機制的話, A程式必須傳一個function pointer給B程式,讓B程式可以使用這個function pointer來通知A程式.
function pointer(函式指標)宣告的方式如下:
返回類型 (* 函式指標名稱) (參數列表);
example:
int (* GetPointCallback)(int x, int y);
Callback function的使用案例
例如
: 我們在設計一個觸控繪圖的應用程式時
, 通常不會讓程式不斷地向系統要觸控點的資料
, 而是希望當系統偵測到觸控發生時
, 才會丟回觸控點的資料
, 而這個丟回觸控點的行為
, 就可以設計成
callback function. 其示意圖如下所示
:
[圖 1] Touch Paint Callback function
Callback function 範例程式
TouchAPI.h
#ifdef TOUCHAPI_EXPORTS
#define TOUCH_API __declspec(dllexport)
#else
#define TOUCH_API __declspec(dllimport)
#endif
// 定義觸控點的相關資訊
struct TouchPoint
{
int X;
int Y;
};
// 定義callback function的prototype
// CB_TOUCH_FUNC是一個pointer,指向具有一個TouchPoint類型,且回傳void型的函数
// 前面有個typedef,所以現在CB_TOUCH_FUNC是這種類型的别名
typedef void (_stdcall *CB_TOUCH_FUNC) (TouchPoint);
// 定義了一個RegisterCBTouchFunc的函式,可傳入一個具有CB_TOUCH_FUNC型別的callback function
TOUCH_API void RegisterCBTouchFunc(CB_TOUCH_FUNC callback);
TouchAPI.cpp
#include "stdafx.h"
#include "TouchAPI.h"
void DetectTouchFromSystem(CB_TOUCH_FUNC callback)
{
// 當系統取得touch資料時,
// 就會呼叫一次pCB_TOUCH_FUNC參數所指到function一次
TouchPoint tp;
tp.X = 5;
tp.Y = 10;
callback(tp);
}
void RegisterCallbackTouchFunc(CB_TOUCH_FUNC callback)
{
DetectTouchFromSystem(callback);
}
TouchPaint.cpp
#include "stdafx.h"
#include "conio.h"
#include "TouchAPI.h"
// 定義了一個名為GetTouch的函式, 也就是callback函式
// 它的prototype必須與TouchAPI的CB_TOUCH_FUNC宣告一致
void _stdcall GetTouch(TouchPoint point)
{
printf("x=%d, y=%d", point.X, point.Y);
}
int main(void)
{
//註冊一個callback function
RegisterCBTouchFunc(GetTouch);
getch();
return 0 ;
};
參考資料:
何謂callback function
Callback (computer science)