下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Callback函数观点Callback函数观点1.回调函数与普通函数的区别从概念上讲,回调函数与普通函数的本质在于:调用者的不同。普通函数由程序员代码调用,而回调函数由操作系统在适当的时间调用。回调函数主要用于处各种事件和处理。由于WINDOWS系统中存在大量程序员事先不可知的事件,例如鼠标的单击,程序员事先无法得知终端用户何时会发出此动作,因此只能:A。定义事件的处理逻辑,与普通函数的编程一样;B。告之操作系统自己的处理逻辑,即通知操作系统函数指针;VC/VB等现代编程语言通过事件编程机制隐藏了这一步;C。操作系统在事件出现时,调用指定的函数(回调函数的概念)处理,这一步完全由系统负责。回调函数在各种操作系统中普遍存在,是现代操作系统为程序员提供处理异步事件的基本机制之一,在不同的系统中的具体实现方式各不相同;请参阅随机文档。Callback函数实质就是你实现这个函数,由操作系统调用。而一般的情况下是,操作系统提供函数由你来调用的。2.回调函数实际上就起到了消息循环的作用,因为在sdk中只有通过回调函数来发送各自的处理消息3.C/C++实现象C/C++这样支持函数指针的语言都有回调函数的概念,它实际上是向被调用函数传一个你的函数地址,然后被调用函数向通过你传入的函数地址来调用你的函数。比如你做了一个遍历树的函数,但你不知遍历者将对各节点做何种处理时,你就可以在这个遍历函数中加一个函数地址的参数,这样调用者在遍历该树时就可以做各种有意义的工作了:比如打印各节点数据、汇总所有节点之类。4.Windows回调函回调函数是用来处理窗口消息的函数,一般类型为WindowProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam);hWnd为窗口句柄,message为消息ID,后面两个为消息参数。MFC将一部分处理消息的函数封状在CWnd类中,如OnCreate等,其参数也从WPARAMwParam,LPARAMlParam转换为LPCREATESTRUCT结构(可以查看映射宏定义及MFC源代码)而其他的有些也可以用回调函数,如WM_TIMER消息,可以在SetTimer函数里面第三个参数指定回调函数,若为NULL则应该在OnTimer函数中处理改消息。5.MSDN中的描述Usedtoasynchronouslyreadthemessagesinaqueue.Itisanapplication-definedfunctionthatMSMQcallswhenamessageisavailable,atime-outoccurs,oranerroroccurs.6.Callback最本质的特征包括两点:注册和触发Callback函数是你提供给系统调用的函数。很多情况下,系统某个情况下,定义需要执行某个操作,而操作本身由有用户的程序来提供,这时,就要用到回调函数了。所以,简单地说。回调函数,就是你写一个函数,在系统定义的地点提供给系统调用。举个例子:SetTimer(),一种处理是,你响应WM_TIMER消息,这暂且不讨论;还有一种用法,就是你提供一个函数,让系统在产生timer消息时自动调用,这种情况下,你可以写好一个timer消息的处理函数,把函数的地址作为SetTimer()的参数,而你这个timer消息的处理函数,就是回调函数。其实callback并不仅限于系统调用,用户根据需要,可以建立自己的Callback机制。比如网络通讯,当接收线程(可能专门有一个类封装网络接收行为)收到数据包,需要通知上层(可能又有一个类封装上层数据处理).那么我认为Callback最本质的特征包括两点:注册和触发。实现可以是各种各样的形式,但机制都是如此。比如对于两个类而言,给出以下示例代码:#include<iostream.h>classB{public:B();voidOnGetMsg(unsignedlongID,constchar*MsgName);private:unsignedlongm_ID;};B::B(){m_ID=1002;}voidB::OnGetMsg(unsignedlongID,constchar*MsgName){cout<<"srcObjID="<<ID<<","<<"tgtObjID="<<m_ID<<",\"<<"Message:"<<MsgName<<endl;}classA{public:A();voidRegisterMsg(B*pb);voidSendMsg(char*msg);private:B*m_pb;unsignedlongm_ID;};A::A(){m_ID=1001;m_pb=NULL;}voidA::RegisterMsg(B*pb){m_pb=pb;}voidA::SendMsg(char*msg){if(m_pb!=NULL)m_pb->OnGetMsg(m_ID,msg);}voidmain(){//产生回调的类对象aAa;//相应回调的类对象bBb;//A类对象注册a.RegisterMsg(&b);//A类对象触发、B类对象响应a.SendMsg("i'mcallbackfunction");}Callback函数有点类似虚函数,不仅仅系统调用,而且你自己也可以定义Callback函数,比如在自己的类中定义Callback函数的原型,然后在类的其他成员函数中就可以直接调用该Callback函数,而不用管他的具体实现,当然你可以传入参数。而具体实现可能在其他应用程序中或者Dll中,这样可以把接口和实现分离。reference:SDK(相关概念:API、动态链接库、导入库)其实很简单,SDK就是SoftwareDevelopmentKit的缩写,中文意思就是“软件开发工具包”。这是一个覆盖面相当广泛的名词,可以这么说:辅助开发某一类软件的相关文档、范例和工具的集合都可以叫做“SDK”。具体到我们这个系列教程,我们后面只讨论广义SDK的一个子集——即开发Windows平台下的应用程序所使用的SDK。呵呵,其实上面只是说了一个SDK大概的概念而已,理解什么是SDK真有这么容易吗?恐怕没这么简单!为了解释什么是SDK我们不得不引入API、动态链接库、导入库等等概念。^_^,不要怕,也就是几个新的名词而已,我也是到了大学快结束的时候才体会到其实学习新知识就是在学习新名词、新概念和新术语。首先要接触的是“API”,也就是ApplicationProgrammingInterface,其实就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的API而使操作系统去执行应用程序的命令(动作)。其实早在DOS时代就有API的概念,只不过那个时候的API是以中断调用的形式(INT21h)提供的,在DOS下跑的应用程序都直接或间接的通过中断调用来使用操作系统功能,比如将AH置为30h后调用INT21h就可以得到DOS操作系统的版本号。而在Windows中,系统API是以函数调用的方式提供的。同样是取得操作系统的版本号,在Windows中你所要做的就是调用GetVersionEx()函数。可以这么说,DOSAPI是“Thinkingin汇编语言”的,而WindowsAPI则是“Thinkingin高级语言”的。DOSAPI是系统程序的一部分,他们与系统一同被载入内存并且可以通过中断矢量表找到他们的入口,那么WindowsAPI呢?要说明白这个问题就不得不引入我们下面要介绍得这个概念——DLL。DLL(又是一个缩写,感觉IT这个行业里三字头缩写特别多),即DynamicLinkLibrary(动态链接库)。我们经常会看到一些.dll格式的文件,这些文件就是动态链接库文件,其实也是一种可执行文件格式。跟.exe文件不同的是,.dll文件不能直接执行,他们通常由.exe在执行时装入,内含有一些资源以及可执行代码等。其实Windows的三大模块就是以DLL的形式提供的(Kernel32.dll,User32.dll,GDI32.dll),里面就含有了API函数的执行代码。为了使用DLL中的API函数,我们必须要有API函数的声明(.H)和其导入库(.LIB),函数的原型声明不难理解,那么导入库又是做什么用的呢?我们暂时先这样理解:导入库是为了在DLL中找到API的入口点而使用的。所以,为了使用API函数,我们就要有跟API所对应的.H和.LIB文件,而SDK正是提供了一整套开发Windows应用程序所需的相关文件、范例和工具的“工具包”。到此为止,我们才真正的解释
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2019粤教版 高中美术 必修1 美术鉴赏《第四单元 外国美术鉴赏》大单元整体教学设计2020课标
- 2024届河北省正定县七中3月高三一轮复习摸底考试(线上)数学试题
- 2024届贵州省铜仁市铜仁伟才学校高三寒假考试(一)数学试题
- 2024届广东顺德华侨中学招生全国统一考试内参模拟测卷(一)(全国3卷)数学试题
- 叉车三包维修合同模板
- 材料员劳动合同
- 玻璃吊装安全协议书范本
- 北京市政府合同管理办法
- 园区应急管理介绍
- 规划现状分析图
- 新高考教学质量考核方案
- (完整版)韩国商法
- 体育课教学活动设计方案
- 中华民族共同体概论课件第六讲五胡入华与中华民族大交融(魏晋南北朝)
- 2024中国南水北调集团东线有限公司招聘笔试参考题库含答案解析
- (正式版)JBT 9229-2024 剪叉式升降工作平台
- 【课件】Unit+3Extended+reading+Of+Friendship+说课课件牛津译林版(2020)高中英语必修第一册
- 注射相关感染预防与控制
- 2024年广东佛山市三水海江昇平建设工程有限公司招聘笔试参考题库附带答案详解
- 4.1DNA是主要的遗传物质课件高一下学期生物人教版必修2
- 2024年度-常规心电图操作培训课件
评论
0/150
提交评论