VisualC++中回调函数使用的变身大法

VisualC++中回调函数使用的变身大法,第1张

VisualC++中回调函数使用的变身大法,第2张

回调函数的编写一直是编写特殊处理函数程序的技巧之一。首先,介绍回调的基本方法和原理。

1.这里设置:回调函数是A()(这是最简单的没有参数的情况,但是我们应用的实际情况往往很复杂),使用回调函数的操作函数是B(),但是B函数需要参数,参数是指向函数A的地址变量,这个变量一般是函数指针。使用方法是:

int A(char * p);//回调函数
typedef int(* callback)(char * p);//声明回调类型的函数指针
CallBack my CallBack;//声明函数指针变量
my callback = A;//获取函数a的地址。

B函数一般写成B(回调lpCall,char * P,...);//这里省略了p后面的参数形式。

所以回调机制可以解释为:函数B要完成某些功能,但它自己无法实现所有功能。需要借助函数A,也就是回调函数来完成。b的实现是:

b(回调lpcall,char * p provide)
{
...........//b的自实现函数语句
LP call(PpProvide);//处理回调完成的函数,也就是A函数。
自我实现功能声明...........//b
}
/-
char * p = "。;
CallBack my CallBack;
my callback = A;
B(A,p);


以上是回调的基本应用。本文所说的转换,其实就是通过传入不同的函数地址,来实现调用者类和回调函数类的不同转换。

1.问题描述

CUploadFile类完成数据上传,并显示相应界面的进度。

主函数Send(...)和回调函数GetCurState();

类CUploadFile:public CDialog
{
......
int Send(LPCTSTR lpServerIP,LPCTSTR lpServerPort,LPCTSTR UploadFilePath);
static int GetCurState(int nCurDone,int nInAll,void * PP aram);
......
}
int CUploadFile::Send(LPCTSTR lpServerIP,LPCTSTR lpServerPort,Lpstr上传文件路径)
{
...//导出传输数据的函数
intret = upload((lpstr)(lpctstr)m _ strdata,
getcurstate,//处理接口的指针
this,// CUploadFile本身在这个回调函数中,也就是pParam接受的参数
(lpstr)(lpctstr)uploadfile path,
" ",
",
]);
}
int CUploadFile::GetCurState(int nCurData,int nInAll,void * pParam)
{
.........
UploadFile * p this =(UploadFile *)PP aram;// nCurData的当前外发数据量
/n all的总数据量
//通过pThis,可以在界面上进行各种操作。
.............
}

但是仔细观察可以发现,这个类集数据传输和界面显示于一体,不容易复用。此外,在重用过程中需要进行许多更改。

请记住当前回调函数传入的类本身的静态成员函数。

现在我们把数据传输和界面显示分开。接口处理类的静态函数由回调传入。


接口处理类CShowGUI,数据上传类CUploadData

类CUploadData
{
......
typedef int(* SetUploadCaller)(int nCurData,int nInAll,void * PP aram);
int upload file(LPCTSTR lpfilename path,LPVOID lparam,SetUploadCaller Caller);
//接受外部访问的参数,主要是回调函数的地址通过参数caller传递,
int send (lpctstr LP服务器IP,lpctstr LP服务器端口,lpctstr上传文件路径);
......//注意,此时不再需要GetCurState函数。
}

类CShowGUI:public CDialog
{
.......
typedef int(* SetUploadCaller)(int nCurData,int nInAll,void * PP aram);
void set callback(LPCTSTR strPath);
static int GetCurState(int nCurData,int nInAll,void * PP aram);
CUploadData m _ Uploa
d;//数据上传类是接口显示类的成员变量。
.......
}

void CShowGUI::set callback(LPCTSTR strPath)
{
CUploadData myUploadData;
SetUploadCaller my caller;//声明一个函数指针变量
my caller = CurState;//获取接口处理程序的地址
myuploaddata . uploadfile(strpath,this,my caller);//接口处理类的函数输入实现了数据输入和接口处理的分离。
}

通过上面的演示,接口和数据是分离的,回调函数扮演的角色也不同,所以要结合不同的问题灵活应用。但是由于数据处理类不知道接口处理类或者外部调用类的类型,所以无法灵活处理界面的不同显示方式。这方面也希望喜欢研究技术的朋友继续研究。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » VisualC++中回调函数使用的变身大法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情