文章分类 | 推荐文章 | 最新文章 | 热点文章 | 最新软件 | 精品软件 | 下载排行 | 推荐下载 | 免费看大片 | WPS | 杀毒软件
清风网络
首 页 软件下载 网络学院 数码学院
QQ 电脑入门 游戏 操作系统 图形处理 办公软件 媒体动画 精文荟萃 工具软件 网络编程 程序开发 网络技术 认证考试 网站建设 文章专栏
当前位置:清风网络学院程序开发IT人生回调设计模式
精品推荐
特别推荐
·值得回忆的本科四年学习(1-6)
·如何检测内存泄漏——重载new和delete
·Linux IPC小结
·编程初学者的良言警句
·如何用正确的方法写出高质量软件的75条体会
·一个程序员的经典自白
·程序员十大安全技巧
热点TOP10
·网管工作总结--我的网管生活经历
·李纳斯·托沃兹(Linus Torvalds):Linux之父
·华硕员工长篇记实:天堂向左,华硕往右
·将CStdioFile类扩展,读取UNICODE文本文件
·VC++学习方法及书籍推荐
·SP 短信开发-PROVISION接口实现-正向订购实例代码
·从ACM会议看中国大陆计算机科学与国外的差距-- 灵芯
·如何检测内存泄漏——重载new和delete
·七年之后我逃离编程
·用DirectDraw编写动画程序
·dotproject 安装总结
·老程序员十年生涯黯然总结
·回调设计模式
·IT人的酸甜苦辣 女测试工程师的成长
·Linux IPC小结
·一位30岁软件工程硕士的困惑
·值得回忆的本科四年学习(1-6)
·老程序员十年生涯黯然总结(四)
·SP 短信开发-PROVISION接口实现-反向取消实例代码
·世界五大顶级合法黑客和他们的创新故事

回调设计模式

日期:2007年5月18日 作者: 查看:[大字体 中字体 小字体]


0. 引言
使用过SDK的朋友应该知道“回调函数”(callback function)这个概念,但本文并不是介绍如何使用回调函数,而是站在SDK开发者的角度,讲述如何实现回调机制。

1. 何为回调(callback)
 所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。
 一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B叫甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。
 下面举个通俗的例子:
 某天,我打电话向你请教问题,当然是个难题,:),你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。
 这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。

2. 什么情况下使用回调
 如果你是SDK的使用者,一旦别人制定了回调机制,那么你被迫得使用回调函数,因此这个问题只对SDK设计者有意义。
 从引入的目的看,回调大致分为三种:
 1) SDK有消息需要通知应用程序,比如定时器被触发;
 2) SDK的执行需要应用程序的参与,比如SDK需要你提供一种排序算法;
 3) SDK的操作比较费时,但又不能让应用程序阻塞在那里,于是采用异步方式,让调用函数及时返回,SDK另起线程在后台执行操作,待操作完成后再将结果通知应用程序。
 经上面这样一总结,你也许会恍然大悟:原来“回调机制”无处不在啊!
 是的,不光是Win32 API编程中你会用到,也不光是其它SDK编程中会用到,平时我们自己编写程序时也可能用到回调机制,这时,我们既是回调的设计者又是回调的使用者。

3. 传统SDK回调函数设计模式
 Win32 SDK是这方面的典型例子,这类SDK的函数接口都是基于C语言的,SDK或者提供专门的注册函数,用于注册回调函数的地址,或者是在调用某个方法时才传入回调函数的地址,回调函数的原型也由于注册函数中的函数指针定义而受到约束。
 以Win32中的多媒体定时器函数为例,其原型为:
MMRESULT timeSetEvent(
  UINT uDelay,  // 定时器时间间隔,以毫秒为单位             
  UINT uResolution,          
  LPTIMECALLBACK lpTimeProc,  // 回调函数地址
  DWORD dwUser,  // 用户设定的数据            
  UINT fuEvent               
);

 其中第三个参数便是用于注册回调函数的,第四个参数用于设定用户自定义数据,其作用将在后文说明,LPTIMECALLBACK的定义为:
typedef void (CALLBACK TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
typedef TIMECALLBACK FAR *LPTIMECALLBACK;
因此,用户定义的回调函数必须具有上面指定的函数原型,下面是回调函数的具体使用方法:
#include "stdio.h"
#include "windows.h"

#include "mmsystem.h" // 多媒体定时器需要包含此文件
#pragma comment(lib, "winmm.lib") // 多媒体定时器需要导入此库

void CALLBACK timer_proc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2) // 定义回调函数
{
 printf("time out.\n");
}

int main()
{
 UINT nId = timeSetEvent( 1000, 0, timer_proc, 0, TIME_CALLBACK_FUNCTIONTIME_PERIODIC); // 注册回调函数
 getchar();
 timeKillEvent( nId );

[1] [2] [3] [4] [5] 下一页 




上一篇:[Regex]笑容的正则表达式大全

下一篇:stream, formatter, serialize(二)

回调设计模式 相关文章:
·3DS Max 7卧室效果图设计:建模篇
·VB+Access设计图书管理系统
·如何建立一个网站?规划、设计、目的、原则、宣传
·飞机订票系统设计
·华北水利水电学院新校区校园网规划与设计
·校园网网络方案设计及分析
·Java图形用户界面设计
·如何以安全模式启动计算机
·英文字体创意设计及应用作品欣赏
·VB设计有语音报时和报警功能的闹钟
回调设计模式 相关软件:
·美工设计教程
·Dreamweaver 网页设计
·C语言程序设计
·Photoshop CS中文版平面设计师标准案例教程
·Photoshop CS经典创意设计200例
·Photoshop 7.0 平面 广告 装帧设计100例
·Windows环境下32位汇编语言程序设计
·远潮自我形象设计系统
·PhotoShop7 设计百例 + 经典实例教程 + 滤镜教学
·建筑抗震设计规范GB50011-2001

特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
[打印本页] [关闭窗口] 转载请注明来源:http://www.viphot.com
| 帮助(?) | 版权声明 | 友情连接 | 关于我们 | 信息发布
Copyright 2007 www.viphot.com All Rights Reserved. 鄂ICP备05000083号Powered by:viphot