动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   .Net → 阅读文章

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

作者来源: 
阅读 1828 人次 , 2006-4-25 14:58:00 


  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可以对界面进行各种操作了。
 .............
}

  但大家仔细观察就可以发现,这个类把数据传送和界面显示聚和到了一起,不容易得到复用。而且在复用过程中需要改动较多的地方 。

  请大家记住现在的回调函数传入的类本身的静态成员函数。

  现在我们把数据的传送和界面的显示分离。回调则要传入的是界面处理类的静态函数。
  
 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:Visual C++.NET编程讲座之六
· 下一篇:Visual C++ 2005中混合代码的初始化
· 结合singleton和线程做一个定时服务
· VB.NET面向对象的实现(目录)
· VC++.NET下GDI+编程之GDI+简介
· 按钮列的应用
· 怎么由DataSet将数据导入Excel?


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077