1、在这里设:回调函数为a()(这是最简单的情况,不带参数,但我们应用的实际情况常常很会复杂),使用回调函数的操作函数为b(), 但b函数是需要参数的,这个参数就是指向函数a的地址变量,这个变量一般就是函数指针。使用方法为:
int a(char *p); // 回调函数
typedef int(*callback)(char *p) ; // 声明callback 类型的函数指针
callback mycallback ; // 声明函数指针变量
mycallback = a; // 得到了函数a的地址
b函数一般会写为 b(callback lpcall,char * p,........); // 此处省略了p后的参数形式 。
所以回调机制可解为,函数b要完成一定功能,但他自己是无法实现全部功能的。 需要借助于函数a来完成,也就是回调函数。b的实现为:
b(callback lpcall,char *pprovide)
{
........... // b 的自己实现功能语句
lpcall(ppprovide); // 借助回调完成的功能 ,也就是a函数来处理的。
........... // b 的自己实现功能语句
}
// -------------- 使用例子 -------------
char *p = "hello!";
callback mycallback ;
mycallback = a ;
b(a, p);
以上就是回调的基本应用,本文所说的变身,其实是利用传入不同的函数地址,实现调用者类与回调函数所在类的不同转换。
1、问题描述
cuploadfile 类完成数据上传,与相应的界面进度显示。
主要函数send(...) 和回调函数 getcurstate() ;
class cuploadfile : public cdialog
{
......
int send(lpctstr lpserverip, lpctstr lpserverport, lpctstr uploadfilepath) ;
static int getcurstate(int ncurdone, int ninall, void * pparam) ;
......
}
int cuploadfile ::send(lpctstr lpserverip, lpctstr lpserverport, lpctstr uploadfilepath)
{
... // 导出传输数据的函数
int ret = upload( (lpstr)(lpctstr)m_strdata,
getcurstate, // 在这个回调函数中处理界面
this, // cuploadfile 的自身指针 ,也就是pparam 所接受的参数
(lpstr)(lpctstr)uploadfilepath,
"",
"",
);
}
int cuploadfile ::getcurstate(int ncurdata, int ninall, void * pparam)
{
.........
uploadfile *pthis = (uploadfile *)pparam; // ncurdata 当前以传出的数据量
// ninall 总的数据量
// 有了pthis可以对界面进行各种操作了。
.............
}
但大家仔细观察就可以发现,这个类把数据传送和界面显示聚和到了一起,不容易得到复用。而且在复用过程中需要改动较多的地方 。
请大家记住现在的回调函数传入的类本身的静态成员函数。
现在我们把数据的传送和界面的显示分离。回调则要传入的是界面处理类的静态函数。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器