马上注册登录,享用更多网站功能!
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
引言:
练拳不练功,等于一场空。
我把二次开发比做练拳了,而功则是你用的计算机语言,对于哪种语言好,哪种不好,这个凭各人爱好。我喜欢C/C++。
这篇文章是小弟学习回调机制的一些心得。有错的地方,多多指点。认为这个和二次开发没关系的兄弟可以不用看。但我觉得它们关系挺大。
准备:打开C语言的教材,仔细阅读指向函数的指针那章,也叫函数指针。最好是K&R的经典的《The C Programming Language》,因为它的用例好,不象谭好强的书里所用的例子纯粹是为教学而写的。
关于函数指针,在此只引用《The C Programming Language》在函数指针这一节中的第一段话:
In C, a function itself is not a variable, but it is possible to define pointers to functions, which can be assigned, placed in arrays, passed to functions, returned by functions, and so on.
我们关注着其中一句:指向函数的指针可以当作参数传递给另一个函数。利用这个性质,就可以实现回调机制了。
///////////////////////////////////////////////////////////////////////////////////
[1]什么是回调。不管正经书上怎么解释,本文说的是大实话。
被调用者调用了调用者的功能,这就是回调。
这句话很拗口。但理解起来不很困难。有人把回调函数的发明比喻为程序设计领域的四大发明之一。了解C#的兄弟也许会知道,C#中的委托是利用函数指针来实现的,事件是由回调来实现的。仅仅因为它是C#中的,而很多人就认为这是C#的优点。
第一个回调的例子:
如果写过WIN32 SDK程序的兄弟会知道,那个封装了switch...case的WndProc函数是叫系统回调函数的。程序窗口的消息在这个函数中得以处理。按照上面的定义,可以这样子理解:WIN32操作系统向程序员提供功能,程序员们要调用这些功能来写程序,这样WIN32就是被调用者,程序员写的程序是调用者。由于程序员写的WndProc要由操作系统来调用,那么这就构成了一种回调机制。
第二个回调的例子:
我们在UG下做二次开发,也经常碰到回调机制。譬如:
//----------------------------------------------------------------
//菜单动作表,将回调函数与菜单项连接起来
//----------------------------------------------------------------
static UF_MB_action_t action_table[]=
{
{"DataImport_cb",(UF_MB_callback_t)DataImport_cb,NULL},
{ NULL, NULL,NULL}
};
//----------------------------------
//菜单回调函数
//----------------------------------
static UF_MB_cb_status_t DataImport_cb(UF_MB_widget_t widget,UF_MB_data_t client_data,UF_MB_activated_button_p_t call_button )
{
UF_initialize();
uc1601("read data",1);
UF_terminate();
return UF_MB_CB_CONTINUE;
}
extern void ufsta( char *parm, int *returnCode, int rlen )
{
/* Initialize the API environment */
UF_initialize();
UF_CALL(UF_MB_add_actions(action_table));
/* Terminate the API environment */
UF_terminate();
}
我们做UG的二次开发,要调用UG的库函数,那么我们的二次开发程序就是调用者,UG是被调用者。上面为了响应菜单动作,我们写了一个函数,想点击菜单项时调用那个函数,这个函数是由UG调用的。这也是被调用者调用了调用者的功能的例子。 |