回调函数的使用

回调函数的使用

ID:41471265

大小:64.44 KB

页数:10页

时间:2019-08-25

回调函数的使用_第1页
回调函数的使用_第2页
回调函数的使用_第3页
回调函数的使用_第4页
回调函数的使用_第5页
资源描述:

《回调函数的使用》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、回调函数的使用2011-01-0714:501452人阅读评论(3)收藏举报calIbackuserclass编程timer手机0.引言使用过SDK的朋友应该知道“回调函数”(callbackfunction)这个概念,但木文并不是介绍如何使用回调函数,而是站在SDK开发者的角度,讲述如何实现回调机制。1.何为回调(callback)所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就

2、是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B叫甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。下面举个通俗的例子:某天,我打电话向你请教问题,当然是个难题,:),你一吋想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高

3、釆烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“冋调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。2.什么情况下使用回调如果你是SDK的使用者,一旦别人制定了回调机制,那么你被迫得使用回调函数,因此这个问题只对SDK设计者有意义。从引入的目的看,回调大致分为三种:1)SDK有消息需要通知应用程序,比如定时器被触发;2)SDK的

4、执行需要应用程序的参与,比如SDK需要你提供一种排序算法;3)SDK的操作比较费时,但又不能让应用程序阻塞在那里,于是采用异步方式,让调用函数及时返冋,SDK另起线程在后台执行操作,待操作完成后再将结果通知应用程序。经上面这样一总结,你也许会恍然大悟:原来“回调机制”无处不在啊!是的,不光是Win32API编程中你会用到,也不光是其它SDK编程中会用到,平时我们自己编写程序时也可能用到回调机制,这时,我们既是回调的设计者又是回调的使用者。3.传统SDKIhI调函数设计模式Win32SDK是这方面的

5、典型例子,这类SDK的函数接口都是基于C语言的,SDK或者提供专门的注册函数,用于注册冋调函数的地址,或者是在调用某个方法时才传入冋调函数的地址,冋调函数的原型也由于注册函数中的函数指针定义而受到约束。以Win32中的多媒体定时器函数为例,其原型为:MMRESULTtimeSetEvent(UINTuDelay,//定时器时间间隔,以毫秒为单位UINTuRcsolution,LPT1MECALLBACKlpTimeProc,//回调函数地址DWORDdwUser,//用户设定的数据UINTfuEv

6、ent);其屮第三个参数便是用于注册回调函数的,第四个参数用于设定用户自定义数据,其作用将在后文说明,LPTIMECALLBACK的定义为:typedefvoid(CALLBACKTIMECALLBACK)(UINTuTimerlD,UINTuMsg,DWORDdwUser,DWORDdwl,DWORDdw2);typedefTTMECALLBACKFAR^LPTIMECALLBACK;因此,用户定义的回调函数必须具有上面指定的函数原型,下面是回调函数的具体使用方法:#inelude"stdio.

7、h〃#inelude〃windows.h〃#include"mmsystem.h〃//多媒体定吋器需要包含此文件^pragmacomment(lib,,zwinmm.lib,z)//多媒体定时器需要导入此库voidCALLBACKtimer_proc(UINTuTimerlD,UINTuMsg,DWORDdwUser,DWORDdwl,DWORDdw2)//定义回调函数{printf(^timeout./n〃);intmain(){UINTnld二timeSetEvent(1000,0,timer

8、_proc,0,TIME_CALLBACK_FUNCTION

9、TIME_PERIODIC);//注册冋调函数getchar();timcKillEvcnt(nld);return0;}运行程序,我们会看到,屏幕上每隔一秒将会打印出“limeout."信息。同时我们也应该注意到,这里的timeSetEvent是异步执行的,timeSetEvent很快执行完毕,主线程继续执行,操作系统在后台负责检查timer是否超时。前面已经说过,本文的是站在SDK设计者的角度来看待问题,这里,我们就

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。