谁能通俗的解释回调函数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁能通俗的解释回调函数?相关的知识,希望对你有一定的参考价值。
我实在不理解为什么要回调,怎么回调,怎么执行过程.跪求高手前辈指点啊,或者有什么这方面的书籍可以推荐的,请赐教.分我不在乎,问题能解决我必有回报!先谢过了
我还是不明白,这与直接调用另外一个函数有什么区别,为什么非得"回调",
假设,A函数调用了一个回调函数B,,然后等B执行完了再反过来调用A.
这样还不如在A函数里直接调用B函数呢,呵呵,晚辈一时心急,请各位不惜赐教,分是无所谓的
我又有另外一个疑问了,如果说"A:"B,你去干f。干好了叫我干g。"",那为什么非得把函数用地址传进去呢?直接在f函数里调用不就OK了么,何必要绕个弯子
多谢" BlueWanderer"前辈的指点,这样吧,如果你能给我 推荐些关于这类似的问题的书,我就再给你加50分.如何?
前辈,那有没有书能详细的介绍windows消息机制之类的比较好的书 呢
void f() ... 调用这个函数话...和回调没有任何关系。就相当于A:"B,你去干f。"
void f(int (*g)()) ... g(); 这个函数就带有回调的特征。调用的时候好像 A:"B,你去干f。干好了叫我干g。"
也就是调用方留一个让被调用方在特定时候通知他的线索,对他进行“回调”。
----
接着上面说,f这个工作要求是干完以后干一件事g。但是这个g并不是f自己规定的,是在调用f的时候再告诉f的。比如你可以让B在完成的时候,什么也不干;或者叫你一声;或者让你干另外一件事。就是说g这个工作本身就是个变量。
----
如果不作为参数提供,g就成了f固定的一部分。A直接说“你去干f”不就是了。作为参数的意义就在于,这个g可以随意改变。
----
基本上不可能有书会去具体讲回调函数。回调只是一个很基本的函数指针的使用。 参考技术A 什么是回调函数?
首先做一个形象的比喻:
你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机是我通知你的手段,它就是回叫函数,也叫回调函数
回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
理解回调函数!
程序在调用一个函数(function)时(通常指api).相当于程序(program)呼叫(Call)了一个函数(function)关系表示如下:
call(调用)
program --------------------→ dll
程序在调用一个函数时,将自己的函数的地址作为参数传递给程序调用的函数时(那么这个自己的函数称回调函数).需要回调函数的 DLL 函数往往是一些必须重复执行某些操作的函数.关系表示如下:
call(调用)
program --------------------→ dll
↑ ¦
¦_______________________________¦
callback(回调)
当你调用的函数在传递返回值给回调函数时,你就可以利用回调函数来处理或完成一定的操作。至于如何定义自己的回调函数,跟具体使用的API函数有关,很多不同类别的回调函数有各种各样的参数,有关这些参数的描述一般在帮助中有说明回调函数的参数和返回值等.其实简单说回调函数就是你所写的函数满足一定条件后,被DLL调用!
也有这样的说法(比较容易理解):
回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:
1. 声明;
2. 定义;
3. 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用。
.NET Framework 开发人员指南
回调函数是托管应用程序中可帮助非托管 DLL 函数完成任务的代码。对回调函数的调用将从托管应用程序中,通过一个 DLL 函数,间接地传递给托管实现。在用平台调用调用的多种 DLL 函数中,有些函数要求正确地运行托管代码中的回调函数。
回调函数和实现要从托管代码中调用大多数 DLL 函数,可创建该函数的托管定义,然后调用该函数。此过程比较直接。
要使用需要回调函数的 DLL 函数,则会有一些附加的步骤。首先,必须在文档中查阅该函数,确定该函数是否需要回调。接着,必须在托管应用程序中创建回调函数。最后,调用该 DLL 函数,并将指向回调函数的指针当作参数进行传递。右图总结了这些步骤。
回调函数非常适合在重复执行任务的情况下使用。另一个常见用途是与枚举函数(如 Win32 API 中的 EnumFontFamilies、EnumPrinters 和 EnumWindows)一起使用。EnumWindows 函数枚举计算机上的所有现有窗口,并调用回调函数以针对每个窗口执行任务. 参考技术B 简单的说,回调函数,当你调用了一个函数,但是这个函数仅仅是算法的一部分,你还需要自己定义一部分算法,该函数会自动调用你自定义的“回调函数”。
如下例子:
比如你要枚举所有的窗口。可以调用EnumWindows函数。但是,EnumWindows仅仅是将窗口枚举出来,至于如何处理则需要你来定义。
就是说,当你调用EnumWindow,要指定一个回调函数,来告诉EnumWindow,当她枚举到窗口的时候,应该怎么处理这个窗口。
CallBack( HWND wnd ... ) //EnumWindow的回调函数
//这里是自定定义的
//假设设计目的是要找出标题为 “xxx”的窗口;
CString str = GetWindowText( wnd );
if( ! str.Compare( "xxx" ))
g_hWnd = wnd; // 保存这个窗口的句柄;
return TRUE; // 告诉EnumWindow不需要再继续枚举了。
else
return FALSE; // 告诉EnumWindow,这次枚举到的
// 不是我要找的,还需要继续枚举下一个窗口。
............某代码.............
g_hWnd = NULL; // 初始化保存所找窗口句柄的变量。
EnumWindow( CallBack ...... ); 调用枚举函数并指定回调函数。
if( g_hWnd )
// 说明已经找到了
else
// 依然没有找到。
百度上贴代码,真是影像美感啊。 参考技术C 老板分配给你一个任务,但考虑到你完成这个任务存在困难。于是老板告诉你:如有任何问题,请于x时x地将你不能完成的任务提交给我,我帮你完成。然后老板把你提交的东西带走并帮你实现。
回调函数作用与此类似。一个服务系统(包括windows,以及在dll开发中,我们称之为服务程序),需要调用很多函数或接受许多未知信息来运行,这时,我们可以提供个回调函数接口给用户,由用户去实现这个函数。注意,回调函数不用我们去调用,是由服务系统调用的,我们的任务是去实现回调函数,这样我们就完成了与服务程序的对话。
回调函数不是由你调用的,是系统提供给你让你去实现、去使用的。回调函数是被哪里调用的,在什么情况下调用的,你是不知道的,你只能实现这个函数,只要你实现了这个函数,你的程序就会使用到这个函数,而普通函数你的程序中如果不调用则不起作用。例如窗口过程函数,你的程序并不调用,但你需要实现这个函数,这样你的程序执行后,窗口过程函数就会起作用;如果你定义了一个普通函数fun,如果你的程序中并没有调用,那么在你的程序中fun这个函数就不会起作用。 参考技术D 回调只是名称上的东西.CALL BACK宏其实就是stdcall.
回调就是你把A函数的地址传给B函数.B函数在一定条件满足后执行A函数.
任何函数都可以作为回调函数.
没有很深的技术上的知识.
以上是关于谁能通俗的解释回调函数?的主要内容,如果未能解决你的问题,请参考以下文章