ChinaUnix >> 文档中心 >> 开发技术 >> 程序开发 >> Web开发 >> 正文 IT新闻与评论交流区
 
Delphi基础 回调函数及其使用
发布者:51CTO  日期: 2011-05-20 17:19:00 浏览次数:0 (共有_条评论) 查看评论 | 我要评论
 

“回调机制”是window 在执行某个API函数的过程中,调用指定的一个函数(回调函数)。

比如:你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机是我通知你的手段,它就是回叫函数,也叫回调函数(Callback Function)。

简单说就是,由程序员编写的,给windows系统(API)调用的函数。 也就是说,函数的功能有你定,调用有windows系统(API)调用。

回调函数就是通过函数的指针来调用的函数。对于一个传递给其他函数的参数,如果你传递的是一个函数的指针(也就是地址),当这个指针被用来调用这个函数时,就可以说是构造了一个回调函数。就是你把自定义函数地址给别人,别人调用你的函数。

回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。

1. 回调函数是由开发者按照一定的原型进行定义的函

2. 回调函数并不由开发者直接调用执行

3 .回调函数通常作为参数传递给系统API,由该API来调用。

4. 回调函数可能被系统API调用一次,也可能被循环调用多次。

回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,回调函数提供了一种异步的机制,相对于同步执行,提高了效率.

前者的例子如WriteFileEx,ReadFileEx等,函数的最后一个参数是一个回调函数的指针,程序中调用WriteFileEx以后,就直接返回了,可以继续进行其他工作,系统在读写操作完成后通知程序作善后处理.后者的例子就是windows的事件机制回调函数的另一个用途,是用于一些枚举函数,如EnumDisplayModes等,每找到一种支持的显示模式,就通知回调函数,由回调函数具体处理,这是因为 EnumDisplayModes本身并不知道用户要如何处理.能,用户提供回调函数,定制系统的功能,这样,不同的用户提供不同的回调函数,可以使系统具有不同的功能.

这就是所谓的plugin.使用回调函数实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(这个函数为回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,利用传递的地址调用回调函数,这时你可以利用这个机会在回调函数中处理消息或完成一定的操作。至于如何定义回调函数,跟具体使用的API函数有关,一般在帮助中有说明回调函数的参数和返回值等。

1。比如在内核编程中,驱动程序就要提供一些回调函数,当一个设备的数据读写完成后,让系统调用这些回调函数来执行一些后续工作。

2。回调函数和其他函数没什么区别,只是有固定的参数和调用约定,比如windows的回掉函数都要用stdcall. 参数是由调用这个回调函数的函数传递的,当然要规定好参数格式。使用很简单,就是传递这个回调函数的地址给调用的函数作为一个参数。比如创建线程的时候就是这样的 。

3。回调函数的使用主要在于windows原有的API函数,但对于用户的自定义的调用函数一般在于动态连接库中。常规的同一个工程下面一般不需要使用回调函数。(个人认为).。

使用回调函数需要注意的地方:

1、 定义一个回调函数类型,跟一般的函数过程的定义并没有什么区别,但其定义必须根据需要满足回调函数的函数要求,唯一的区别在于在函数或过程的定义后面必须声明其为windows标准调用;
例:
对于函数的声明:

type

  1. THDFunction= function(I:integer;s:string):integer; stdcall; 

对于过程的声明:

type

  1. THDProcedure=procedure(s:string); stdcall; 

2、 然后根据此原形定义一个相应的函数或过程,对于这个函数或过程来说名字没有什么要求,对函数其参数的类型和返回值的类型必须和定义的回调函数类型完全一致,对于过程来说,只需要其参数类型一样就可以了。

例:根据上面的函数和过程的原形定义一个相应的函数和一个相应的过程。

函数原形定义:

  1. Function HdFunExample(k:integer,sExam:string):integer; stdcall; 

过程定义:

  1. procedure HdProExample(sExam:string);stdcall; 

3、 在程序中实现此回调函数或着过程;

  1. Function HdFunExample(k:integer,sExam:string):integer; stdcall;  
  2. Begin  
  3. End;  
  4. procedure HdProExample(sExam:string);stdcall;  
  5. begin  
  6. end; 

4、 调用过程;

回调函数一般作为系统的某个函数的入口地址;

根据调用函数的原形:

假设有如下调用函数:

  1. function DyHdFunExample(HdFun:THDFunction;I:integer):boolean

注:

在调用函数中通过对函数指针的处理可以直接调用回调函数(即调用函数中的那个是回调函数类型的参数,直接操作它),使回调函数履行一定的操作。即在调用函数中实现回调函数的功能。

调用:

  1. var 
  2. I:integer;  
  3. begin  
  4. I:=DyHdFunExample(@HdFunExample,i);  
  5. //…….  
  6. End; 


    >>更多交流,请到 ChinaUnix【Web开发论坛】:http://bbs2.chinaunix.net/forumdisplay.php?fid=80

网友评论 已有0位网友发表了看法

  • 验证码:
    【输入评论后显示验证码,均为大写字母,点击图片更新】
        
 
 论坛最新热点更多>> 
· extjs4.0的视频教程
· 我写的密码强度验证方法
· JavaScript css的使用总结
· iframe或colorbox 父子窗口调用...
· js 正则表达式大全
· HTML 代码中怎么实现点击一个超...
· javascript基础(一)
· Jquery EasyUI combogrid 分页
· 正则表达式在javascript中的几...
· html的自动刷新
 论坛热门讨论更多>> 
· 用javascript获取文件大小
· 如何让PHP调用Javascript?
· 天涯只看楼主FireFox扩展
· 优秀的开源报表工具BIRT(百灵)介绍
· [TITLE的BUG]你的IE浏览器有这...
· [限时拍卖][12月10日止]《网页...
· 女生是否适合做开发?大家进来...
· 你做Web开发用什么语言和技术?
· 求libxml2 for aix 64Bit 谢谢
· 服务器端如何分辨客户端使用的...
 本周十大热点新闻 
· 详解360系列产品 将重回苹果AP...
· 小伙毕业旅行从澳大利亚骑车回浙江
· 台湾,我来了----台湾八日游第一天
· 明星纷抢红馆开演唱会 谢霆锋年...
· 360深陷下架门:或因隐私问题遭...
· 美10岁女生拼出新分子结构将研...
· 环卫工弄脏挡道轿车遭暴打续:...
· 支付宝一家独大格局开始洗牌:1...
· 永中注册商标价值几何?
· 造型设计已经定型 全新QQ将于明...
 本周十大争议新闻 
· 长安大学两男生为救同学溺水身亡
· 网帖曝光现役军人回家探亲时拍...
· 58同城回应虚假信息问题:建立...
· 资料:话剧《笑面人》演员-刘端端
· 青岛建设银行员工晒工资和支出...
· 《加勒比海盗4》杰克船长是镇台...
· 《甄嬛传》演员阵容强大 孙茜演...
· 资料图片:《我爱记歌词》领唱...
· 资料图片:《麻辣女兵》主要演...
· 新版《西游记》坎坷上路 减少6...
 
 
 

Copyright © 2001-2010 ChinaUnix.net All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
 

京ICP证:060528号