回调是一种重要的软件设计模式,要模块之间进行通信的一种方式。
下面通过一个例子简明回调:
大家都有过从硬盘复制文件的经历,如果文件比较大的话,就从看到一个进程条在滚动,这是如何实现的呢?
首先,我们分为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
请按任意键继续. . .