什麼是Callback function?
如果在程式中使用某個function, 我們可稱作”call” function,這種行為是主動的, 而callback function是被動的, 也就是當特定事件發生時(例如觸控發生, 或某手勢被偵測),callback function才會被呼叫.
function pointer(函式指標)宣告的方式如下:
而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);
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)
沒有留言:
張貼留言