
函數(shù)名作為參數(shù)傳遞與回調(diào)函數(shù)
成員函數(shù)名不能作為參數(shù)傳遞,否則會(huì)發(fā)生錯(cuò)誤,因?yàn)槔锩骐[藏著一個(gè)this 指針
回調(diào)函數(shù),就是由你自己寫的。你需要調(diào)用另外一個(gè)函數(shù),而這個(gè)函數(shù)的其中一個(gè)參數(shù),就是你的這個(gè)回調(diào)函數(shù)名。這樣,系統(tǒng)在必要的時(shí)候,就會(huì)調(diào)用你寫的回調(diào)函數(shù),這樣你就可以在回調(diào)函數(shù)里完成你要做的事。
模塊A有一個(gè)函數(shù)foo,它向模塊B傳遞foo的地址,然后在B里面發(fā)生某種事件(event)時(shí),通過從A里面?zhèn)鬟f過來的foo的地址調(diào)用foo,通知A發(fā)生了什么事情,讓A作出相應(yīng)反應(yīng)。 那么我們就把foo稱為回調(diào)函數(shù)。
我的理解:(有待再看)
eg:s.dll有一個(gè)函數(shù)s_create,向柜臺(tái)服務(wù)器傳遞ServerCallBack函數(shù)的地址,之后,在柜臺(tái)服務(wù)器里發(fā)生了某種事情后,通過s.dll的s_create里傳遞過來的ServerCallBack函數(shù)的地址,來調(diào)用ServerCallBack函數(shù),通知s.dll發(fā)生了什么事情,讓s.dll做出反應(yīng)
比如,客戶端發(fā)出了某個(gè)請(qǐng)求給s.dll,然后s.dll進(jìn)行一系列通信工作,當(dāng)s.dll調(diào)用s_create時(shí),s.dll回停一會(huì),先去做另外一件事件,就是執(zhí)行ServerCallBack函數(shù)(該函數(shù)的指針是作為s_create的參數(shù)形式存在的),ServerCallBack執(zhí)行了各種通信的消息處理之后,返回到s_create。繼續(xù)向下進(jìn)行
例子:
回調(diào)函數(shù)是一個(gè)很有用,也很重要的概念。當(dāng)發(fā)生某種事件時(shí),系統(tǒng)或其他函數(shù)將會(huì)自動(dòng)調(diào)用你定義的一段函數(shù)?;卣{(diào)函數(shù)在使用的場(chǎng)合很多,比如Hook回調(diào)函數(shù):MouseProc,GetMsgProc以及EnumWindows,DrawState的回調(diào)函數(shù)等等,還有很多系統(tǒng)級(jí)的回調(diào)過程。本文不準(zhǔn)備介紹這些函數(shù)和過程,而是談?wù)剬?shí)現(xiàn)自己的回調(diào)函數(shù)的一些經(jīng)驗(yàn)。
之所以產(chǎn)生使用回調(diào)函數(shù)這個(gè)想法,是因?yàn)楝F(xiàn)在使用VC和Delphi混合編程,用VC寫的一個(gè)DLL程序進(jìn)行一些時(shí)間比較長(zhǎng)的異步工作,工作完成之后,需 要通知使用DLL的應(yīng)用程序:某些事件已經(jīng)完成,請(qǐng)?zhí)幚硎录暮罄m(xù)部分。開始想過使用同步對(duì)象,文件影射,消息等實(shí)現(xiàn)DLL函數(shù)到應(yīng)用程序的通知,后來突 然想到可不可以在應(yīng)用程序端先寫一個(gè)函數(shù),等需要處理后續(xù)事宜的時(shí)候,在DLL里直接調(diào)用這個(gè)函數(shù)即可。
于是就動(dòng)手,寫了個(gè)回調(diào)函數(shù)的原形。在VC和 Delphi里都進(jìn)行了
一:聲明回調(diào)函數(shù)類型。
vc版
typedef int (WINAPI *PFCALLBACK)(int Param1,int Param2) ;
二:聲明回調(diào)函數(shù)原形
聲明函數(shù)原形
vc版
int WINAPI CBFunc(int Param1,int Param2);
三: 回調(diào)函數(shù)調(diào)用調(diào)用者
調(diào)用回調(diào)函數(shù)的函數(shù)我把它放到了DLL里,這是一個(gè)很簡(jiǎn)單的VC生成的WIN32 DLL.并使用DEF文件輸出其函數(shù)名 TestCallBack。實(shí)現(xiàn)如下:
PFCALLBACK gCallBack=0;
void WINAPI TestCallBack(PFCALLBACK Func)
{
if(Func==NULL)return;
gCallBack=Func;
DWORD ThreadID=0;
HANDLE hThread = CreateThread( NULL, NULL, Thread1, LPVOID(0), &ThreadID );
return;
}
此函數(shù)的工作把傳入的 PFCALLBACK Func參數(shù)保存起來等待使用,并且啟動(dòng)一個(gè)線程。聲明了一個(gè)函數(shù)指針PFCALLBACK gCallBack保存?zhèn)魅氲暮瘮?shù)地址。
四: 回調(diào)函數(shù)如何被使用:
TestCallBack函數(shù)被調(diào)用后,啟動(dòng)了一個(gè)線程,作為演示,線程人為的進(jìn)行了延時(shí)處理,并且把線程運(yùn)行的過程打印在屏幕上.
五:萬事具備
使用vc和Delphi各建立了一個(gè)工程,編寫回調(diào)函數(shù)的實(shí)現(xiàn)部分
VC版
int WINAPI CBFunc(int Param1,int Param2)
{
int res= Param1+Param2;
TCHAR Buffer[256]="";
sprintf(Buffer,"callback result = %d",res);
MessageBox(NULL,Buffer,"Testing",MB_OK); //演示回調(diào)函數(shù)被調(diào)用
return res;
}
使用靜態(tài)連接的方法連接DLL里的出口函數(shù) TestCallBack,在工程里添加 Button( 對(duì)于Delphi的工程,還需要在Form1上放一個(gè)Edit控件,默認(rèn)名為Edit1)。
響應(yīng)ButtonClick事件調(diào)用 TestCallBack
TestCallBack(CBFunc) //函數(shù)的參數(shù)CBFunc為回調(diào)函數(shù)的地址
函數(shù)調(diào)用創(chuàng)建線程后立刻返回,應(yīng)用程序可以同時(shí)干別的事情去了?,F(xiàn)在可以看到屏幕上不停的顯示字符串,表示dll里創(chuàng)建的線程運(yùn)行正常。一會(huì)之后,線程延 時(shí)部分結(jié)束結(jié)束,vc的應(yīng)用程序彈出MessageBox,表示回調(diào)函數(shù)被調(diào)用并顯示根據(jù)Param1,Param2運(yùn)算的結(jié)果,Delphi的程序 edit控件里的文本則被改寫成Param1,Param2 的運(yùn)算結(jié)果。
可見使用回調(diào)函數(shù)的編程模式,可以根據(jù)不同的需求傳遞不同的回調(diào)函數(shù)地址,或者定義各種回調(diào)函數(shù)的原形(同時(shí)也需要改變使用回調(diào)函數(shù)的參數(shù)和返回值約 定),實(shí)現(xiàn)多種回調(diào)事件處理,可以使程序的控制靈活多變,也是一種高效率的,清晰的程序模塊之間的耦合方式。在一些異步或復(fù)雜的程序系統(tǒng)里尤其有用 -- 你可以在一個(gè)模塊(如DLL)里專心實(shí)現(xiàn)模塊核心的業(yè)務(wù)流程和功能,外圍的擴(kuò)展的功能只給出一個(gè)回調(diào)函數(shù)的接口,通過調(diào)用其他模塊傳遞過來的回調(diào)函數(shù)地址的方式,將后續(xù)處理無縫地交給另一個(gè)模塊,隨它按自定義的方式處理。
本文的例子使用了在DLL里的多線程延時(shí)后調(diào)用回調(diào)函數(shù)的方式,只是為了突出一下回調(diào)函數(shù)的效果,其實(shí)只要是在本進(jìn)程之內(nèi),都可以隨你高興可以把函數(shù)地址傳遞來傳遞去,當(dāng)成回調(diào)函數(shù)使用。
這樣的編程模式原理非常簡(jiǎn)單單一:就是把函數(shù)也看成一個(gè)指針一個(gè)地址來調(diào)用,沒有什么別的復(fù)雜的東西,僅僅是編程里的一個(gè)小技巧。至于回調(diào)函數(shù)模式究竟能為你帶來多少好處,就看你是否使用,如何使用這種編程模式了。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03