回调函数与回调机制.docx

上传人:lao****ou 文档编号:47292 上传时间:2022-12-08 格式:DOCX 页数:4 大小:87.65KB
下载 相关 举报
回调函数与回调机制.docx_第1页
第1页 / 共4页
回调函数与回调机制.docx_第2页
第2页 / 共4页
回调函数与回调机制.docx_第3页
第3页 / 共4页
亲,该文档总共4页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《回调函数与回调机制.docx》由会员分享,可在线阅读,更多相关《回调函数与回调机制.docx(4页珍藏版)》请在第一文库网上搜索。

1、回调函数与回调机制1 .什么是回调函数回调函数(callback Function),顾名思义,用于回调的函数。回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的个函数。回调函数是个工作流的一部分,由工作流来决定函数的调用(回调)时机。回调函数包含下面几个特性: 属于工作流的一个部分; 必须按照工作流指定的调用约定来申明(定义); 他的调用时机由工作流决定,回调函数的实现者不能直接调用回调函数来实现工作流的 功能:2 .回调机制回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。如上图所示,工作流提供了

2、两个对外接口(获取参数、显示结果),以问调函数的形式实现。 ”获取参数徊调函数,需要工作流使用者设定工作流计算需要的参数C ”显示结果回调函数,提供计算结果给工作流使用者。再以Windows的枚举顶级窗体为例。函数EnumWindows用于枚举当前系统中的所有顶级窗口,其函数原型为:BOOL EnumWindovs(WNDENUMPROC IpEnumFunc, / callback functionLPARAM IParam / application-defined value);其中DEnumFunc是个回调函数,他用于返回枚举过程中的获得的窗口的句柄。其定义约定为:BOOL CALLB

3、ACK EnumWindowsProc(HWND hwndr / handle to parent windowLPARAM IParam / application-defined value在这个例子中,EnumWindows是一个工作流,这个工作流用于遍历windows的所有窗口并获得其句柄。用户使用EnumWindows工作流的目的是想通过工作流来来获取窗口的句柄以便针对特定的一个或多个窗口进行相关处理。于是EnumWindows就扩展出接口IpEnumFunc,用于返回遍历的窗口句柄。EnumWindows工作流的结束有两个方式:1,用户在回调函数中返回FALSE; 2,再也找不到顶

4、级窗口。我们可以推测EnumWindows的实现机制如下:注:下列代码中的 FindFirstTopWindows()z FindNextTopWindow()为假设的,Windows API没有此函数,只是为了表明Enumwindows的内部流程。BOOL EnumWindows(WNDENUMPROC DEnumFunc, / callback functionLPARAM IParam / application-defined valueBOOL bRet = TRUE;HWND hWnd = :FindFirstTopWindows(); / 此函数是假设的,查找第一个顶级窗口/当h

5、Wnd为0时表示再也找不到顶级窗口while( hWnd )bRet = (*lpEnumFuncN hWndz value );if( !bRet)break; / 终止 EnumWindows 工作流;hWnd = :FindNextWindow(); /此函数是假设的,查找下一个顶级窗口)在EnumWindows()函数中,实现了窗口枚举的工作流,他通过回调机制把用户关心(顶级窗口句柄)的和枚举工作流分开,用户不需要知道EnumWindows的具体实现,用户只要知道,设定了gc函数,然后把函数指针传给EnumWindwos就可以获得想要的窗口句柄。2 .回调机制应用使用回调机制,可以为工

6、作流实现扩展。可以把工作流中需要用户干预的,或需要提供给用户的数据以回调的模式提供给用户。而用户不需要知道整个工作的流程,只需知道回调函数的说明就可以使用工作流模块提供的功能,这对信息的隐藏也是有作用的。3 .回调机制的实现形式 回调函数 虚拟函数 事件example:以虚函数实现回调机制class CWorkFlowvoid init()(_a = 0;,b = 0;int _a;int _b;public:void Start()(/初始化init();/调用处理数据Handle( a, b );/报告结果Report( a, b );virtual void Handle( int &a, int &b ) = 0;virtual void Report( int iRet) = 0;;class CMain :public CWorkFlowpublic:void Handle( int &a, int &b )a = a + b/2;void Report( int iRet)(printf(iRet = %dn, iRet);); applicationint main()CMain main;main.StartO;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 汇报材料

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



客服