Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28008
  • 博文数量: 10
  • 博客积分: 360
  • 博客等级: 一等列兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-24 20:58
文章分类

全部博文(10)

文章存档

2011年(1)

2010年(9)

我的朋友
最近访客

分类: C/C++

2010-07-15 23:20:40

回调是一种重要的软件设计模式,要模块之间进行通信的一种方式。

下面通过一个例子简明回调:

大家都有过从硬盘复制文件的经历,如果文件比较大的话,就从看到一个进程条在滚动,这是如何实现的呢?

首先,我们分为UI模块和底层模块。其中,UI是可以用来显示进度条在滚动的过程,而在底层模块是实现COPY操作的函数,底层模块是不能显示进度条的。如果要实现这个过程,需要做的工作如下:UI调用COPY函数实现文件的COPY,而底层是知道COPY的进度的,但其自身是不能显示进度的,所以底层不断的每隔相对短的一个时间内调用UI实现的显示进度函数而完成。

重点讲一下我们如何使用回调函数:

欲知回调函数,先知函数指针。int * abc(int xyz)与int (*abc)(int xyz)两者有什么区别呢?第一个是一个参数为int返回值为int *类型指针的函数,第二个是一个指针类型,这种指针指向参数为int 返回值为int型的函数。在第二个里面abc就是一个函数指针。

下面有比如UI和COPY两个模块来实现上面的功能,代码清单如下:

/* copy.h */
#ifndef _COPY_H_
#define _COPY_H_
typedef void (*PorcCallback)(int );
void UICallback(PorcCallback callback); 
#endif

/* copy.c */

#include “copy.h”

PorcCallback  g_callback;

void UICallback(PorcCallback callback)

{

       g_callback = callback;

       int i = 0;

       for(i;i<10;i++)

       g_callback(i);

}

/* ui.c */

#include

#include “copy.h”

void out(int n)

{

       printf(“%d\n”,n);

}

int main(int argc, char *argv[])

{

       UICallback(out);

       return 0;

}

运行结果如下:

0

1

2

3

4

5

6

7

8

9

请按任意键继续. . .

阅读(1369) | 评论(0) | 转发(0) |
0

上一篇:函数里静态局部变量

下一篇:小程序

给主人留下些什么吧!~~