回调的真正涵意

来源:互联网 发布:办公软件网站 编辑:程序博客网 时间:2024/05/01 01:38

1、回调函数的处理

由于DDEML机制需要使用回调函数,因此使用DDEML的关键是解决在MFC编程体系中回 调函数的使用。回调函数(Callback function)大量用于Windows的系统服务,通过 它,程序员可以安装设备驱动程序和消息过滤系统,以控制Windows的有效使用。 许多程序员都发现,利用MFC或者其它的C++应用编写回调函数是非常麻烦的,其根 本原因是回调函数是基于C编程的Windows SDK的技术,不是针对C++的,程序员可以 将一个C函数直接作为回调函数,但是如果试图直接使用C++的成员函数作为回调函 数将发生错误,甚至编译就不能通过。通过查询资料发现,其错误是普通的C++成员 函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递一个指向自 身的指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为 什么C++类的多个实例可以共享成员函数但是确有不同的数据成员。由于this指针的 作用,使得将一个CALLBACK型的成员函数作为回调函数安装时就会因为隐含的this 指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关 键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调 函数所遇到的问题。这种方法具有通用性,适合于任何C++

1. 不使用成员函数,直接使用普通C函数,为了实现在C函数中可以访问类的成员变 量,可以使用友元操作符(friend),在C++中将该C函数说明为类的友元即可。这种 处理机制与普通的C编程中使用回调函数一样。

2. 使用静态成员函数,静态成员函数不使用this指针作为隐含参数,这样就可以作 为回调函数了。静态成员函数具有两大特点:其一,可以在没有类实例的情况下使 用;其二,只能访问静态成员变量和静态成员函数,不能访问非静态成员变量和非 静态成员函数。由于在C++中使用类成员函数作为回调函数的目的就是为了访问所有 的成员变量和成员函数,如果作不到这一点将不具有实际意义。解决的办法也很简 单,就是使用一个静态类指针作为类成员,通过在类创建时初始化该静态指针,如 pThis=this,然后在回调函数中通过该静态指针就可以访问所有成员变量和成员函 数了。这种处理办法适用于只有一个类实例的情况,因为多个类实例将共享静态类 成员和静态成员函数,这就导致静态指针指向最后创建的类实例。为了避免这种情 况,可以使用回调函数的一个参数来传递this指针,从而实现数据成员共享。这种 方法稍稍麻烦,这里就不再赘述。

---------------------------------------------------------------------------------------------

Callback Function: 回调函数

  在侯sir的<<深入浅出>>中一开始就提出了这个概念,大概的提法是说回调函数是操作系统调用而你永远不要去调用的函数
(这句话我看过很多次,不解(我觉自已写的其它function也可以, 但function自身不能call),  可能是主要用于传递给系统api来进行消息处理-----------Windows程序的开发是围绕着对众多消息的合理响应和实现来实现程序的各种功 能的。使用过C语言来开发Windows程序的人都知道,在Windows程序的窗口回调函数 中需要安tch语句来响应大量的消息,同时由于消息的间断性使得不同的消息 响应之间信息的传递是通过大量的全局变量或者静态数据来实现的。 人们常用的两种类库OWL和MFC都提供了消息映射机制用以加速开发速度,使用者只 需要按规定定义好对应消息的处理函数自身即可,至于实际调用由类库本身所提供 的机制进行,或采用虚函数,或采用消息映射宏。)。
这个提法让初学者有点望而生畏,以为是一种多么高深而难以领会的系统底层的核心技术。其实不然,这个技术本质很简单,而且很常用。它实质就是函数指针的基本运用(如果不知道什么是函数指针的话,翻翻书)。在一个模块中,有时想让一部分功能由其它模块实现,譬如说一个做显示的模块,它只想实现显示的资源配备,画面的刷新,缩放等控制功能,而把画具体实体(譬如圆、多边形,都可以有很多种不同效率的实现方法)的代码由别的模块来实现,怎么办呢?用函数指针。在自己的类中放一个画圆的函数指针,使用时由外部为这个函数指针赋值(其实就是指向了一个外部的函数),在自己的代码中直接调用这个函数指针来画就可以了(本模块完全不知道外部模块是怎么画圆的)。那个外部的函数在这里就是回调函数!

  在很多系统API中就使用了这种函数回调的方法,让我们开发的代码实现可以嵌入到API的代码实现当中,其实我们就是传了一个函数地址给它而已。换句话说,这些API搭好了某些运行的代码框架,我们来为它具体实现。

----------------------------------------------------------------------------

回调函数如何工作

第一个是Call
第二个是CallBack(回调,我觉得翻译调回更好的,先调再选回,可能是中国文学没字不怎么通吧,呵呵,)

原创粉丝点击