2010年9月8日 星期三

Callback Function

什麼是Callback function?  
如果在程式中使用某個function, 我們可稱作”call” function,這種行為是主動的,  callback function是被動的, 也就是當特定事件發生時(例如觸控發生, 或某手勢被偵測),callback function才會被呼叫.

CallbackC/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)

沒有留言:

張貼留言