當我們希望某個事件發生時,會收到通知,如此才可以進行一些相對應的處理工作,若使用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!");
}
創作者介紹
創作者 fiend1120 的頭像
fiend1120

嵌入式的復健筆記

fiend1120 發表在 痞客邦 留言(1) 人氣()