- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
回调函数 与 回调机制
1.? 什么是回调函数
??? 回调函数(callback Function),顾名思义,用于回调的函数。? 回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。回调函数包含下面几个特性:
??? 属于工作流的一个部分;
??? 必须按照工作流指定的调用约定来申明(定义);
??? 他的调用时机由工作流决定,回调函数的实现者不能直接调用回调函数来实现工作流的功能;
???
2. 回调机制
??? 回调机制是一种常见的设计模型,他把工作流内的某个功能,按照约定的接口暴露给外部使用者,为外部使用者提供数据,或要求外部使用者提供数据。
???? 如上图所示,工作流提供了两个对外接口(获取参数、显示结果),以回调函数的形式实现。
?“获取参数”回调函数,需要工作流使用者设定工作流计算需要的参数。
?“显示结果”回调函数,提供计算结果给工作流使用者。
??? 再以Windows的枚举顶级窗体为例。函数EnumWindows用于枚举当前系统中的所有顶级窗口,其函数原型为:??? BOOL EnumWindows(????????????WNDENUMPROC lpEnumFunc, // callback function????????? LPARAM lParam // application-defined value????);???? 其中 lpEnumFunc是一个回调函数,他用于返回枚举过程中的获得的窗口的句柄。其定义约定为:??? BOOL CALLBACK EnumWindowsProc(????????????HWND hwnd, // handle to parent window ????????????LPARAM lParam // application-defined value????);??? 在这个例子中,EnumWindows 是一个工作流,这个工作流用于遍历windows的所有窗口并获得其句柄。用户使用EnumWindows工作流的目的是想通过工作流来来获取窗口的句柄以便针对特定的一个或多个窗口进行相关处理。 于是EnumWindows就扩展出接口 lpEnumFunc,用于返回遍历的窗口句柄。??? EnumWindows工作流的结束有两个方式:1,用户在回调函数中返回FALSE;2,再也找不到顶级窗口。我们可以推测EnumWindows的实现机制如下:??? 注: 下列代码中的? FindFirstTopWindows(), FindNextTopWindow()为假设的,Windows API 没有此函数,只是为了表明Enumwindows的内部流程。??? BOOL EnumWindows(????????????WNDENUMPROC lpEnumFunc, // callback function????????? LPARAM lParam // application-defined value????)????{?????????? BOOL? bRet = TRUE;?????????? HWND hWnd = ::FindFirstTopWindows();? // 此函数是假设的,查找第一个顶级窗口?????????? // 当hWnd为0时表示再也找不到顶级窗口?????????? while( hWnd? )??????????? {??????????????? ?? bRet = ( *lpEnumFunc)( hWnd, value );?????????????????? if( !bRet)??????????????????????? break;????? // 终止EnumWindows工作流;????????????????????????????????????? hWnd = ::FindNextWindow();??? // 此函数是假设的,查找下一个顶级窗口????????????}????}??? 在EnumWindows(...)函数中,实现了窗口枚举的工作流,他通过回调机制把用户关心(顶级窗口句柄)的和枚举工作流分开,用户不需要知道EnumWindows的具体实现,用户只要知道,设定了 lpEnumFunc? 函数,然后把函数指针传给EnumWindwos就可以获得想要的窗口句柄。
2.? 回调机制应用
?? 使用回调机制,可以为工作流实现扩展。 可以把工作流中需要用户干预的,或需要提供给用户的数据以回调的模式提
原创力文档


文档评论(0)