Ads 468x60px

##EasyReadMore##

01 12月, 2015

Callback Function

callback,字面上的解釋就是「回呼」,這牽涉到多工作業系統中兩個同時執行﹝cocurrent﹞的不同模組。一種情形是,A 模組給 B 模組一個 function pointer,請它在處理完某項工作後,或是在適當時機,使用這個 function pointer 來呼叫該函式。例如,A 模組裡面寫了一個 CallMeIfDone 的 function,然後它啟動了 B 模組,並且把 CallMeIfDone 的位址傳給 B 模組。A 模組繼續執行它的工作,B 模組也同時在處理它的事情,等到 B 模組處理完畢,它就會呼叫 CallMeIfDone,但是這個函式是寫在 A 模組裡面的,所以實際上是跑回來 A 模組的地盤執行 CallMeIfDone,因此就稱為「回呼,callback」。另一種情形是,B 模組是一個獨立執行的模組,專門處理使用者輸入,每當使用者敲一下鍵盤,或是動一下滑鼠,它就會產生一個事件,需要處理這些事件的其他模組必須向 B 模組登記 callback function,例如 A 模組向 B 模組登記了 KeyboardEvents 的 callback function,那麼 B 模組在偵測到鍵盤動作時,就會去呼叫這個函式了,當然這個函式也是寫在 A 模組裡面的。


簡單的說,如果你使用了某個function,那麼你就是『call』了一個function。如果系統或是函式是要求你給一個function pointer,這個function pointer指到一個實際的函式(多半這個函式是你自己寫的)。然後它會在適當的時間呼叫此function,則此function就是所謂的 callback function。因為這個function是被『callback』了。

回傳某個函數的指標, 呼叫者便可透過這個函數指標直接執行函數...

Callback Function就是給別人"回呼"的函式。假設這樣場景:

A告訴B:如果幫我訂到OO票,打電話告訴我,我電話是1234
然後B開始一邊處理訂票,一邊去忙自己事情。當B訂到票之後,打電話給A通知成功
A收到通知後,就去做後面的準備
B打電話給A的這個動作,就是去做回呼。A不知道B何時會通知他,B也不知道通知A之後要幹麼,一切都靠回呼動作和電話號碼來當通訊而已。

所以以C++來說,電話號碼等於是指標,告訴B電話請B打回,就是去註冊回呼動作!應該可以這樣說吧?借用網路上的範例:

class CallBackClass
{
// 宣告回呼函式的原型;
typedef void (*CBFun)( int k );
// 宣告一個回呼函式指標;
CBFun pCBFun;
public:
CallBackClass() { pCBFun= NULL; }// 初始化;
void SetCallBack( CBFun fun ) { pCBFun= fun; }//註冊callback函式

void run() {
//do something
(*pCBFun)( i );//呼叫到callback function
};
void myCBFun( int k )
{
//自己寫被呼叫到後要幹麼
}
int main( int argc, char* argv[] )
{
CallBackClass cbc;
cbc.SetCallBack( myCBFun );//註冊callback函式
cbc.run();
return 0;
} 我們的程式會用到Socket,要處理Receive的資料,所以把處理Received Data的function當作callback,寫在OnReceive的時候。一旦透過網卡收到封包,就會去callback囉~~


//---------------------------------------------------
//說明:                                                
//        這個是一個callback function...                
//        由Google上找到的例子加以修改而成的...        
//---------------------------------------------------
//若要測試,記得只能存成.c檔...
//(有warning,可以不用理)
//不可以存成.cpp檔...因為complier不會過...            
//---------------------------------------------------
#include <stdio.h>
//就是structure
struct table
{
    char id;
    void *func;
};

void *funcA() { printf("This is funcA()\n"); }
void *funcB() { printf("This is funcB()\n"); }
void *funcC() { printf("This is funcC()\n"); }
void *funcD() { printf("This is funcD()\n"); }

const struct table tb[] = { {1, funcA},
                            {2, funcB},
                            {3, funcC},
                            {4, funcD} };
//宣告callback function的prototype(原型)
void (*func)(void);       
int main(int argc,char *argv[])
{
    int index, i;
    index = 1;
    for (i = 0; i < 4; i++)
    {
        if (index == tb[i].id)
        {
            func = tb[i].func;
            func();//呼叫callback function
        }
        index++;
    }
    printf("如果在這裡呼叫callback function呢?\n");
    func();
return 0;
}

輸出的結果:
This is funcA()
This is funcB()
This is funcC()
This is funcD()
如果在這裡呼叫callback function呢?
This is funcD()
Press any key to continue

何謂callback function? - iT邦幫忙::IT知識分享社群
http://goo.gl/6V5cgh

0 意見:

張貼留言

 
Blogger Templates