打印

关于c语言中的回调函数

[复制链接]
3764|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
年轻不在|  楼主 | 2010-3-19 20:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
介绍下c(Brew Platform)语言中的CallBack(回调函数)机制
举Brew的IMedia的例子进行说明,详细如下:
用户程序(用户进程中运行)需要使用Brew系统服务(系统进程中运行)的IMedia接口,
先创建IMedia对象,然后调用IMEDIA_SetMediaParm,这个就不多说了。
然后就可以调用IMEDIA_RegisterNotify接口了,注意,该接口的第二个参数是个指针,用户需要定义该函数,然后把该函数的函数名作为参数。但定义该函数是一定要按照PFNMEDIANOTIFY的格式进行定义,具体可以查看AEEMedia.h文件中第201行。如果没有按照PFNMEDIANOTIFY进行定义,那么编译会有问题。

那么现在已经向IMedia注册CallBack函数了,接下来我们可以调用IMEDIA_PLAY接口进行播放多媒体文件了,在调用该函数后,IMEDIA_PLAY的返回值说明该函数是否调用成功,(因为在IMEDIA_PLAY函数中会有状态判断,这个不细说了)但是为啥还需要我们刚才注册的CallBack呢,原因是:
播放多媒体需要底层硬件的支持, 也就是说,IMEDIA会向硬件发出播放请求,如果硬件状态是允许播放(不允许同),那么IMedia模块就会调用用户注册的CallBack函数进行通知。

回调函数主要是运用在异步通信中。另外需要注意的是回调函数格式是在下层定义的。

相关帖子

沙发
米其林r| | 2010-3-21 15:15 | 只看该作者
  对于很多初学者来说,往往觉得回调函数很神秘,很想知道回调函数的工作原理。本文将要解释什么是回调函数、它们有什么好处、为什么要使用它们等等问题,在开始之前,假设你已经熟知了函数指针。
  什么是回调函数?
  简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
  为什么要使用回调函数?
  因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。
  如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。
  回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer() API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。
  另一个使用回调机制的API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,为每个窗口调用一个程序提供的函数,并传递窗口的处理程序。如果被调用者返回一个值,就继续进行迭代,否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。
  不管怎么说,回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或函数符(functor),而不是回调函数。

使用特权

评论回复
板凳
itelectron| | 2010-3-21 15:21 | 只看该作者

使用特权

评论回复
地板
北京户口| | 2010-3-28 15:05 | 只看该作者
在编写界面的时候,比如QT中用的非常之多!

使用特权

评论回复
5
六楼的窗户| | 2010-3-28 22:27 | 只看该作者
写的很不错,谢楼主分享

使用特权

评论回复
6
linhai1986| | 2010-3-28 22:34 | 只看该作者
写得好,顶一个

使用特权

评论回复
7
回到从前| | 2012-6-28 16:46 | 只看该作者
谢谢分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

106

主题

447

帖子

1

粉丝