linux callback函数,C++回调函数(callback)的使用
什么是回調(diào)函數(shù)(callback)
模塊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ù)。
例子:
回調(diào)函數(shù)是一個(gè)很有用,也很重要的概念。當(dāng)發(fā)生某種事件時(shí),系統(tǒng)或其他函數(shù)將會自動調(diào)用你定義的一段函數(shù)?;卣{(diào)函數(shù)在windows編程使用的場合很多, 比如Hook回調(diào)函數(shù):MouseProc,GetMsgProc以及EnumWindows,DrawState的回調(diào)函數(shù)等等,還有很多系統(tǒng)級的回調(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í)間比較長的異步工作,工作完成之后,需 要通知使用DLL的應(yīng)用程序:某些事件已經(jīng)完成,請?zhí)幚硎录暮罄m(xù)部分。開始想過使用同步對象,文件影射,消息等實(shí)現(xiàn)DLL函數(shù)到應(yīng)用程序的通知,后來突 然想到可不可以在應(yīng)用程序端先寫一個(gè)函數(shù),等需要處理后續(xù)事宜的時(shí)候,在DLL里直接調(diào)用這個(gè)函數(shù)即可。
于是就動手,寫了個(gè)回調(diào)函數(shù)的原形。在VC和 Delphi里都進(jìn)行了測試
一:聲明回調(diào)函數(shù)類型。
vc版
typedef int (WINAPI *PFCALLBACK)(int Param1,int Param2) ;
Delph版
PFCALLBACK = function(Param1:integer;Param2:integer):integer;stdcall;
實(shí)際上是聲明了一個(gè)返回值為int,傳入?yún)?shù)為兩個(gè)int的指向函數(shù)的指針。
由于C++和PASCAL編譯器對參數(shù)入棧和函數(shù)返回的處理有可能不一致,把函數(shù)類型用WINAPI(WINAPI宏展開就是__stdcall)或stdcall統(tǒng)一修飾。
二:聲明回調(diào)函數(shù)原形
聲明函數(shù)原形
vc版
int WINAPI CBFunc(int Param1,int Param2);
Delphi版
function CBFunc(Param1,Param2:integer):integer;stdcall;
以上函數(shù)為全局函數(shù),如果要使用一個(gè)類里的函數(shù)作為回調(diào)函數(shù)原形,把該類函數(shù)聲明為靜態(tài)函數(shù)即可。
三: 回調(diào)函數(shù)調(diào)用調(diào)用者
調(diào)用回調(diào)函數(shù)的函數(shù)我把它放到了DLL里,這是一個(gè)很簡單的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ù)保存起來等待使用,并且啟動一個(gè)線程。聲明了一個(gè)函數(shù)指針PFCALLBACK gCallBack保存?zhèn)魅氲暮瘮?shù)地址。
四: 回調(diào)函數(shù)如何被使用:
TestCallBack函數(shù)被調(diào)用后,啟動了一個(gè)線程,作為演示,線程人為的進(jìn)行了延時(shí)處理,并且把線程運(yùn)行的過程打印在屏幕上.
本段線程的代碼也在DLL工程里實(shí)現(xiàn)
ULONG?? WINAPI Thread1(LPVOID Param)
{
TCHAR Buffer[256];
HDC hDC = GetDC(HWND_DESKTOP);
int Step=1;
MSG Msg;
DWORD StartTick;
//一個(gè)延時(shí)循環(huán)
for(;Step<200;Step++)
{
StartTick = GetTickCount();
/*這一段為線程交出部分運(yùn)行時(shí)間以讓系統(tǒng)處理其他事務(wù)*/
for(;GetTickCount()-StartTick<10;)
{
if(PeekMessage(&Msg,NULL,0,0,PM_NOREMOVE) )
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
/*把運(yùn)行情況打印到桌面,這是vcbear調(diào)試程序時(shí)最喜歡干的事情*/
sprintf(Buffer,"Running %04d",Step);
if(hDC!=NULL)
TextOut(hDC,30,50,Buffer,strlen(Buffer));
}
/*延時(shí)一段時(shí)間后調(diào)用回調(diào)函數(shù)*/
(*gCallback)(Step,1);
/*結(jié)束*/
::ReleaseDC (HWND_DESKTOP,hDC);
return 0;
?????? }
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的linux callback函数,C++回调函数(callback)的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真我GT Neo5 SE发布 售价199
- 下一篇: java本地可以发到linux不行,ja