日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux callback函数,C++回调函数(callback)的使用

發(fā)布時(shí)間:2023/12/19 linux 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux callback函数,C++回调函数(callback)的使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是回調(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。