close
當我們希望某個事件發生時,會收到通知,如此才可以進行一些相對應的處理工作,若使用Thread或者Timer去隔一段時間詢問一次,這兩種方法是可以做到,但缺點是既浪費資源又不能及時反應,此時便可以使用CallBack Function,等該事件發生時自己過來呼叫我們進行處理,這樣便不用苦苦等待。
Call Function:
一般主程式呼叫一個函式來執行他所要做的工作時,主程式是主動端,一旦該函式所要做的事做完後就又輪到主程式繼續做後續的事。
CallBack Function:
當主程式呼叫一個函式A 的同時傳入一個指標函式B 給他,當呼叫的函式A 執行到某個條件時,會去呼叫一開始傳入的指標函式B,此時便會回到主程式這端進行主程式傳入的函式B去做動作,而做完之後會再回到函式A 去做未完的事情,完成後才又回來主程式。
以下分成主程式「TestCallBackDlg.cpp」、「TestCallBackDlg.h」及副程式「CallBackFunction.cpp」、「CallBackFunction.h」。
首先是副程式的部分:
//CallBackFunction.h void DFHookCallbackFunc( void (*pFunc)(CString) );
//CallBackFunction.cpp #include "stdafx.h" #include "CallBackFunction.h" void (*pDFHookCallbackFunc)(CString); void DFHookCallbackFunc( void (*pFunc)(CString) ) { pDFHookCallbackFunc = pFunc; if(pDFHookCallbackFunc != NULL) //事件觸發了 { CString str; str = "Call Back Function Start!"; pDFHookCallbackFunc(str); //CallBack回主程式 } AfxMessageBox("Call Back Function End!"); }
再來是主程式的部分,因為我們只需要在Button去呼叫副程式的函式,所以其他程式的部分就與以省略,指列出重點的部分。
// TestCallBackDlg.h void terence(CString str); //要被CallBack的Function
// TestCallBackDlg.cpp #include "stdafx.h" #include "TestCallBack.h" #include "TestCallBackDlg.h" #include "CallBackFunction.h" void terence(CString str) { CString mmm; mmm = str; AfxMessageBox(mmm); } void CTestCallBackDlg::OnOK() { // TODO: Add extra validation here AfxMessageBox("Call Function Start!"); DFHookCallbackFunc(terence); //呼叫外部函式並傳入要被CallBack的Function AfxMessageBox("Call Function End!"); }
全站熱搜