當我們希望某個事件發生時,會收到通知,如此才可以進行一些相對應的處理工作,若使用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!");
}
文章標籤
全站熱搜

你好,如果是用DLL上的按鈕來觸發callback事件,然後將資料(如string)傳給主程式,主程式接到後,將string拿來使用,請問如何操作比較好?