回调函数 迈不过友情╰ 2022-04-15 06:20 256阅读 0赞 实际工作中,对于回调函数一直是我不愿意去触碰的东西,一来由于被很多人搞得神秘兮兮的以为是很高深难懂的技术,二来在一般情况下通过互相包含类指针也能够解决问题,所以一直就不想去研究这个东东,最近一个项目中被经理逼着使用了回调函数,切切实实体会到了它的好处,代码中类之间的关系再也不那么错综复杂了,类A想告诉类B一个事情再也不需要在A中定义B的指针了,定义回调函数即可。下面把我理解的回调函数写出来,抛出一块砖,个中滋味要各位看客多实践才能体会出来。 1、基础知识 所谓回调,就是模块A要通过模块B的某个函数b()完成一定的功能,但是函数b()自己无法实现全部功能,需要反过头来调用模块A中的某个函数a()来完成,这个a()就是回调函数。如下图 ![o_E5_9B_9E_E8_B0_83.JPG][] ①约定接口规范。在模块B必须约定接口规范,也就是定义回调函数a()的函数原型 这里回调函数原型的定义最好遵循typedef void (\*SCT\_XXX)(LPVOID lp, const CBParamStruct& cbNode); SCT\_XXX是回调函数名称,lp是回调上下文,CBParamStruct是回调参数,一般由于要回调的参数不止一个,所以定义一个结构体比较方便。 ②回调函数的注册。为了让模块B知道自己将要使用的回调函数,必须有一个函数或语句来注册回调函数 注册回调函数的定义遵循void RCF\_XXX(SCT\_XXX pfn, LPVOID lp); RCF\_XXX是注册函数名,pfn是回调函数名称(是指针),lp是回调上下文。一般在A模块初始化完B模块后调用,将A模块中定义的回调函数地址赋值给pfn,lp赋值为this。 ③在模块A中要做的事情: 首先将回调函数声明成静态的,static void CF\_XXX(LPVOID lp, const CBParamStruct& cbNode); 函数的参数必须与B模块中回调函数原型的参数保持一致。 初始化B模块时,调用注册函数将模块A中声明的回调函数CF\_XXX的地址传给pfn,即pfn=CF\_XXX;(函数名称CF\_XXX其实是个指针,指向回调函数的地址) 。 2、举例 回调函数使用第一个场景:MFC界面编程。有这样一个需求,主界面左侧是一个树形列表,右侧是一个绘图区用来展示左侧列表项的内容,双击绘图区弹出框用来编辑。一般的做法是在绘图区对话框初始化时将主对话框或者树形列表的指针传进来,在绘图区对话框中处理双击事件,在事件出来函数中调用主对话框或树形列表的指针完成更新操作。这样主对话框类和绘图区对话框类之间就出现了互相包含的关系,回调函数这个时候就可以大显身手了,主对话框仅需要包含绘图区对话框的头文件和声明一个绘图区对话框的对象即可。具体做法是:在绘图区对话框中定义回调函数原型和注册回调的函数,并处理鼠标双击事件,在事件函数中发出回调通知。主对话框中按原型定义回调函数,在回调函数中完成树形列表的更新。 回调函数的第二个应用场景:网络编程。 在网络编程中,为了体现模块化,一般把通讯和数据处理划分开来,即通讯模块负责协议定义、数据收发,而数据处理模块只负责对收发的数据进行解析和打包,假如通讯模块开启了一个线程在持续地接收数据,这个时候问题来了,它通过什么手段把数据交到数据处理模块手中呢?每次收到数据,拿到数据处理模块的指针完成相关操作,这样有犯了两个类指针互相指的错误,也破坏了两个模块的独立性。使用回调函数这些问题都迎刃而解了,下面给出部分伪代码: **通讯模块** **typedef void (\*DataReceiveCBFunc)(ReceiveParam & recvParam);****//** **回调函数原型定义** **// 开始接收,数据处理模块调用,相对于注册回调函数** **static BOOL StartReceive(DataReceiveCBFunc pfnData, LPVOID lpContext,****……****);** **// 接收数据的线程,一收到数据就通知回调** **static UINT TH\_Receive(LPVOID lp);** **数据处理模块** **//** **开始接收数据,开启监听线程****,调用上面的****StartReceive****函数** **int StartReceiveInfo(int nListenPort, std::string strLocalIP);** **//** **数据接收回调函数,被****CUdpEx::TH\_Receive()****回调** **static void RecvInfoCallback(ReceiveParam &recvParam);** [o_E5_9B_9E_E8_B0_83.JPG]: /images/20220415/35a10c29207240e8ac31ad8bc2100a38.png
相关 回调函数 一、回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义 ╰+攻爆jí腚メ/ 2022年06月16日 23:37/ 0 赞/ 207 阅读
相关 回调函数 回调函数是一种函数指针的使用方式。 stdcall和cdecl的区别:这个问题涉及到函数调用的汇编知识,暂只需记住stdcall和cdecl的参数压栈顺序是相同的,参 傷城~/ 2022年06月12日 07:21/ 0 赞/ 213 阅读
相关 回调函数 转自: 回调函数 在看LWIP时,见到用回调函数,再看某老外公司OPC源代码时,见到用回调函数。看我国内某些代码( 朴灿烈づ我的快乐病毒、/ 2022年06月11日 05:36/ 0 赞/ 179 阅读
相关 回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实 青旅半醒/ 2022年06月02日 20:51/ 0 赞/ 220 阅读
相关 回调函数 实际工作中,对于回调函数一直是我不愿意去触碰的东西,一来由于被很多人搞得神秘兮兮的以为是很高深难懂的技术,二来在一般情况下通过互相包含类指针也能够解决问题,所以一直就不想去研究 迈不过友情╰/ 2022年04月15日 06:20/ 0 赞/ 257 阅读
相关 回调函数 需要回调函数的场景:进程池中任何一个任务一旦处理完了,就立即告知主进程:我好了额,你可以处理我的结果了。主进程则调用一个函数去处理该结果,该函数即回调函数 我们可以把耗时间( 女爷i/ 2022年01月07日 07:41/ 0 赞/ 293 阅读
相关 回调函数 转载自[https://zhidao.baidu.com/question/572699725.html][https_zhidao.baidu.com_question_57 水深无声/ 2021年12月12日 04:01/ 0 赞/ 366 阅读
相关 回调函数 作为JS的核心,回调函数和异步执行是紧密相关的,也是必须跨过去的一道个门槛。 那么究竟什么是回调函数(Callback),其实回调函数并不复杂,明白两个重点即可: 1. 函 桃扇骨/ 2021年11月13日 21:28/ 0 赞/ 420 阅读
相关 回调函数 一、定义 什么是回调函数?它首先是一个函数,这是肯定的,我举个例子:有两个函数A和B,首先应用程序将A的地址告诉B,这称之为注册回调函数,B在收到外部某个命令的时候,可以根据 客官°小女子只卖身不卖艺/ 2021年09月30日 11:56/ 0 赞/ 466 阅读
相关 回调与回调函数 回调与回调函数 回调 回调函数 回调 回调指的是某函数在执行的时候,由于某些原因,该函数被迫中止执行,交出当前线程的使用权,当前线程转而执行其它函 悠悠/ 2021年09月25日 04:26/ 0 赞/ 467 阅读
还没有评论,来说两句吧...