谁能形象地举例说明何为回调函数? ( 积分: 50 )

  • 主题发起人 主题发起人 ykjt
  • 开始时间 开始时间
Y

ykjt

Unregistered / Unconfirmed
GUEST, unregistred user!
它是如何工作的?有何用途?
 
它是如何工作的?有何用途?
 
你的函数在另一个函数里运行,
形象吧.
回调函常用在设备上,如声卡,视频卡等等
 
还不好理解
 
use mmsystem
function timeSetEvent(uDelay, uResolution: UINT;
lpFunction: TFNTimeCallBack; dwUser: DWORD; uFlags: UINT): MMRESULT; stdcall;
这个一个定时器创建函数,lpfunction就指一个回调函数,在这个回调函数里可以通过代码说明定时器触发时该做什么事,这样理解行否?
 
“形象地举例说明”????

好吧,我来形象一番:

回调,好比是你是雌性的,一个公的来使用了,他就插进来,就算完成了一次回调。

物理意义上,这个被回调的函数就象是个雌性的函数,具有回调能力的函数就是公函数,雌函数就是按照公函数的要求开放了一个口子,公函数在需要的时候就可以顺着这个口子插进来了。回去复习一下生理卫生的课程对你会有很大帮助的!!!
 
好象窗口函数是回调函数,它是如何工作的?
 
找了一点资料,为同样想知道本问题答案的朋友共享
================================================
使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数,跟具体使用的API函数有关,一般在帮助中有说明回调函数的参数和返回值等。C++中一般要求在回调函数前加CALLBACK,这主要是说明该函数的调用方式。DialogBox的回调函数实际上是个窗口过程,用来处理所有消息。其定义为:
BOOL CALLBACK DialogProc(

HWND hwndDlg, // handle of dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
在Win32 API中有详细说明。一般使用C++ Builder或MFC的往往没有使用SDK编程的经验,建议找一些SDK编程的书看一下,否则很难理解如何使用窗口过程。
至于钩子函数,只是回调函数的一个特例。习惯上把与SetWindowsHookEx函数一起使用的回调函数称为钩子函数。也有人把利用VirtualQueryEx安装的函数称为钩子函数,不过这种叫法不太流行。
==========================
frank的意见:
我对回调函数的理解虽然粗浅,但是我觉得会让人更容易理解:回调函数就相当于一个中断处理函数,由系统在符合你设定的条件时自动调用。为此,你需要做三件事:1,声明;2,定义;3,设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于系统调用。
声明和定义时应注意:回调函数由系统调用,所以可以认为它属于WINDOWS系统。不要把它当作你的某个类的成员函数。
=====================
ping的意见:
frank说:回调函数属于WINDOWS系统。我觉得不应该说回调函数是属于系统的。应该说是程序把这段代码的触发交由系统来做。而这种做法是WINDOWS提供的处理机制吧,因为消息是系统一手掌握着的,由系统来调用我们的程序对消息的处理部分,这样子会比较方便。不然我们又得花力气去读消息列表了。(不知道我说的对不对,接触系统还不深,请高手指教哦)
=============================
也即:回调函数只在约定的情况出现时才被系统调用,是这样吗?那么,是如何约定的呢?
 
function EnumWindows (
lpEnumFunc: TFNWndEnumProc;
lParam: LPARAM): BOOL; stdcall;

type
EnumWindowsProc = function (Hwnd: THandle;
Param: Pointer): Boolean; stdcall;

function GetTitle (Hwnd: THandle; Param: Pointer): Boolean; stdcall;
var
Text: string;
begin
SetLength (Text, 100);
GetWindowText (Hwnd, PChar (Text), 100);
FormCallBack.ListBox1.Items.Add (
IntToStr (Hwnd) + ': ' + Text);
Result := True;
end;

procedure TFormCallback.BtnTitlesClick(Sender: TObject);
var
EWProc: EnumWindowsProc;
begin
ListBox1.Items.Clear;
EWProc := GetTitle;
EnumWindows (@EWProc, 0);
end;
调用getTitle时,参数是如何传递给它?
Hwnd: THandle;
Param: Pointer
分别传入了什么参数?
 
就是你给个函数地址,我来调用
 
有回调能力的一定是win api吗?自已能否编写具有回调能力的函数?谁有例子学习一下。
 
回调只是一种进行通知的方法
 
回调函数就是将某种方法或者接口给对方,对方可以再需要的时候使用你提供的方法或者接口。
回调用到的地方非常多,绝不仅限于WinAPI,在Delphi中,事件其实就是利用的回调机制,不过是类方法而已。
举一个生活中的例子,电影中也能看到的,比如说某个组织的人要去办事情,在办事情的过程中可能要向组织报告工作或者请求指示等等,这个时候他需要某些方法能够联系到组织,组织就为他专门提供了一部手机和一部对讲机,手机用来报告工作进度,对讲机用来请求指示。这种情况,手机和对讲机就可以理解为是组织提供给他的回调函数:)

呵呵,不知道这个例子是否形象
 
你的电话号码,你的家庭地址就是回调,用途就是告诉别人你如何找到我。 但你不会打电话找自己三。
 
参数不是普通的数据,而是函数
 
http://www.2ccc.com/article.asp?articleid=1923 , 看看"程序21-3"和"程序21-4"
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3266111
 
寒周老大flamingo的回复......同时感谢楼主找的资料
 
flamingo <> aimingoo
 
后退
顶部