在实际系统中,异步调用也是回调函数的一种典型用法,调用者首先将回调函数传给实现者,实现者记住这个函数,这称为注册一个回调函数,然后当某个事件发生时实现者再调用先前注册的函数,比如sigaction(2)注册一个信号处理函数,当信号产生时由系统调用该函数进行处理,再比如pthread_create(3)注册一个线程函数,当发生调度时系统切换到新注册的线程函数中运行,在GUI编程中异步回调函数更是有普遍的应用,例如为某个按钮注册一个回调函数,当用户点击按钮时调用它。
/* para_callback.h */
#ifndef PARA_CALLBACK_H
#define PARA_CALLBACK_H
typedef void (*callback_t)(void *);
extern void repeat_three_times(callback_t, void *);
#endif
----------------------------------------------------------------------
/* para_callback.c */
#include "para_callback.h"
//实现者,根据时机再调用回调函数
void repeat_three_times(callback_t f, void *para)
{
f(para);
f(para);
f(para);
}
----------------------------------------------------------------------
/* main.c */
#include
#include "para_callback.h"
void say_hello(void *str) //回调函数
{
printf("Hello %s\n", (const char *)str);
}
void count_numbers(void *num)//回调函数
{
int i;
for(i=1; i<=(int)num; i++)
printf("%d ", i);
putchar('\n');
}
int main(void)
{
repeat_three_times(say_hello, "Guys");
//调用者,也叫注册一个回调函数,是异步的
repeat_three_times(count_numbers, (void *)4);
return 0;
}
阅读(1019) | 评论(0) | 转发(0) |