iCAx开思工具箱

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 26272|回复: 11
打印 上一主题 下一主题

很有用的回调函数

[复制链接]
跳转到指定楼层
楼主
发表于 2005-5-30 23:44:17 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
引言:
练拳不练功,等于一场空。
我把二次开发比做练拳了,而功则是你用的计算机语言,对于哪种语言好,哪种不好,这个凭各人爱好。我喜欢C/C++。
  
这篇文章是小弟学习回调机制的一些心得。有错的地方,多多指点。认为这个和二次开发没关系的兄弟可以不用看。但我觉得它们关系挺大。
  
准备:打开C语言的教材,仔细阅读指向函数的指针那章,也叫函数指针。最好是K&R的经典的《The C Programming Language》,因为它的用例好,不象谭好强的书里所用的例子纯粹是为教学而写的。
  
关于函数指针,在此只引用《The C Programming Language》在函数指针这一节中的第一段话:
In C, a function itself is not a variable, but it is possible to define pointers to functions, which can be assigned, placed in arrays, passed to functions, returned by functions, and so on.
  
我们关注着其中一句:指向函数的指针可以当作参数传递给另一个函数。利用这个性质,就可以实现回调机制了。
  
///////////////////////////////////////////////////////////////////////////////////
[1]什么是回调。不管正经书上怎么解释,本文说的是大实话。
被调用者调用了调用者的功能,这就是回调。
这句话很拗口。但理解起来不很困难。有人把回调函数的发明比喻为程序设计领域的四大发明之一。了解C#的兄弟也许会知道,C#中的委托是利用函数指针来实现的,事件是由回调来实现的。仅仅因为它是C#中的,而很多人就认为这是C#的优点。
  
第一个回调的例子:
如果写过WIN32 SDK程序的兄弟会知道,那个封装了switch...case的WndProc函数是叫系统回调函数的。程序窗口的消息在这个函数中得以处理。按照上面的定义,可以这样子理解:WIN32操作系统向程序员提供功能,程序员们要调用这些功能来写程序,这样WIN32就是被调用者,程序员写的程序是调用者。由于程序员写的WndProc要由操作系统来调用,那么这就构成了一种回调机制。
  
第二个回调的例子:
我们在UG下做二次开发,也经常碰到回调机制。譬如:
//----------------------------------------------------------------
//菜单动作表,将回调函数与菜单项连接起来  
//----------------------------------------------------------------
static UF_MB_action_t action_table[]=  
{  
   {"DataImport_cb",(UF_MB_callback_t)DataImport_cb,NULL},  
   { NULL, NULL,NULL}  
};
//----------------------------------  
//菜单回调函数  
//----------------------------------
static UF_MB_cb_status_t DataImport_cb(UF_MB_widget_t widget,UF_MB_data_t client_data,UF_MB_activated_button_p_t call_button )  
{  
   UF_initialize();  
   uc1601("read data",1);  
      UF_terminate();  
   return UF_MB_CB_CONTINUE;  
}  
extern void ufsta( char *parm, int *returnCode, int rlen )  
{  
     /* Initialize the API environment */  
     UF_initialize();  
    UF_CALL(UF_MB_add_actions(action_table));  
     /* Terminate the API environment */  
     UF_terminate();  
}
  
我们做UG的二次开发,要调用UG的库函数,那么我们的二次开发程序就是调用者,UG是被调用者。上面为了响应菜单动作,我们写了一个函数,想点击菜单项时调用那个函数,这个函数是由UG调用的。这也是被调用者调用了调用者的功能的例子。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 支持支持
12
发表于 2005-6-2 22:10:43 | 只看该作者

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
11
发表于 2005-6-2 20:45:04 | 只看该作者

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
10
发表于 2005-6-1 07:46:11 | 只看该作者

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
9
发表于 2005-5-31 22:29:12 | 只看该作者

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
8
 楼主| 发表于 2005-5-31 21:00:50 | 只看该作者

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
7
 楼主| 发表于 2005-5-31 12:43:31 | 只看该作者

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
6
发表于 2005-5-31 11:54:50 | 只看该作者

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
5
 楼主| 发表于 2005-5-31 11:35:27 | 只看该作者

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
地板
发表于 2005-5-31 11:09:57 | 只看该作者

马上注册登录,享用更多网站功能!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手板模型制作,在线3D打印服务

QQ|小黑屋|手机版|开思工具箱 CAD工具箱_CAM工具箱  

GMT+8, 2024-11-16 09:55 , Processed in 0.015520 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

快速回复 返回顶部 返回列表