回调函数(CallBack Function)

【c++】回调函数(callback function) 之前没有用过回调函数,这次突然用上,搜了一下其他大佬写的文章,看完之后还是云里雾里,所以决定自己从最简单的入手重新梳理一遍。 1.回调函数的概念 所谓回调函数,就是把其他函数作为自己的参数。 这里涉及到取地址的概念,为了思路不那么乱我们重新梳理一遍: 对于一个参数A,&A是取A的地址; 对于一个地址address,*address是取该地址下的值。 (int* b = &a; 对于... 阅读详情

什么是回调函数?

用一句话来形容:回调函数还真有点像您随身带的BP机,告诉别人号码,在它有事情时Call您。换句话说,模块A将一个函数以函数指针的形式注册到模块B,模块B满足一定条件时来调用模块A注册过来的函数,来完成一定的功能,这个过程就是函数的回调。


什么时候调用回调函数?


我们可以把C中完成这个功能的主函数以指针的形式注册到S中,并且保存在S中,当然这个函数的参数可以是C完成这个功能所需要的数据,这样就可以在S中直接调用C注册过来的函数指针,来完成这个功能。下面举个例子:


BNEP的文件中要包含下层(L2CAP)的头文件,但是L2CAP包含BNEP头文件是没有道理的。这样我们就会用到回调函数。在BNEP实现一个函数,然后注册到L2CAP层。参数可以是L2CAP才有的,BNEP需要的数据,这样L2CAP可以根据时机调用BNEP的函数,达到回调的目的。


回调函数经典示例

1. 主线程创建辅助线程—— AssistThread

2. 创建AssistThread的时候会把主线程要执行的一个函数CBFunc以函数指针的形式传递到AssistThread中

3. 在AssistThread结束的时候会用创建AssistThread时传递过来的函数指针,以回调函数的形式调用CBFunc

#include <windows.h>
#include <stdio.h>
typedef int (WINAPI *PFCALLBACK)(int Param1,int Param2) ; /* 定义了一个函数指针类型 */
  
int WINAPI CBFunc(int Param1,int Param2);
ULONG  WINAPI AssistThread(LPVOID Param)
{
  	PFCALLBACK	gCallBack;
  	/* 定义回调函数指针的变量 */
  	TCHAR			Buffer[256];
  	MSG			Msg;
  	DWORD		StartTick;
  	int				Step=1;
  	HDC hDC		= GetDC(HWND_DESKTOP);
  	gCallBack		= (PFCALLBACK)Param;
  	/* 给回掉函数变量赋值 */
  	for(;Step<200;Step++)
  	{
  		StartTick = GetTickCount();
  		/* 这一段为线程交出部分运行时间以让系统处理其他事务 */
  		for(;GetTickCount()-StartTick<10;)
  		{
  			if(PeekMessage(&Msg,NULL,0,0,PM_NOREMOVE) )
  			{
  				TranslateMessage(&Msg);
  				DispatchMessage(&Msg);
  			}
  
  		}                                
  		/* 把运行情况打印到桌面 */
  		sprintf(Buffer,"Running %04d",Step);
  		if(NULL!=hDC)
  		TextOut(hDC,30,50,Buffer,strlen(Buffer));
  	}
  	(*gCallBack)(Step,1);
  	/* 延时一段时间后调用回调函数 */  
  
  	ReleaseDC (HWND_DESKTOP,hDC);
  	/* 结束 */
  
  	return 0;
}
  
void WINAPI TestCallBack(PFCALLBACK Func)
{
  	HANDLE	hThread;
  	DWORD	ThreadID=0;
  	if(NULL==Func)return;
  	hThread = CreateThread(
  						NULL,
  						NULL,
  						AssistThread,
  						(LPVOID)Func,
  						/* 将回调函数指针Func传递到线程AssistThread的主函数中 */
  						0,
  						&ThreadID
  						);
  	
  	WaitForSingleObject( hThread, INFINITE );
  	return;
}
  
int WINAPI CBFunc(int Param1,int Param2)
{
  	int		res= Param1+Param2;
  	TCHAR	Buffer[256]="";
  	sprintf(Buffer,"callback result = %d",res);
  	MessageBox(NULL,Buffer,"Testing",MB_OK);  /* 演示回调函数被调用 */
  	return res;            
}   
  
void main()
{
  	TestCallBack(CBFunc); /* 函数的参数CBFunc为回调函数的地址 */
  	return;
}

注意事项

1. 避免死锁

2. 充分考虑服务器性能


如图2所表示的那样,对于客户端和服务器端的功能来说这样的形式感觉是合情合理的,服务器端触发了客户端的动作,客户端要到服务器端取得数据。

但是我们从图2这个很简单的时序图关系来说,这样是很危险的,在服务器的线程中调用了客户端的回调函数,然后还接着占用服务器端的线程来有调用服务器的接口取得数据,这样就很可能造成系统的死锁。

所以正确的方法是如果客户端完成这个功能需要从服务器端取得数据的话,最好有个线程切换的过程,这样便能避免出现死锁了,如图3所示。


还有一种情况的回调会产生死锁,具体情况下图表示得很清楚。


如上图所示,这种情况下很容易出现死锁,在S端首先Lock住自己的信号量C,然后将要调用C端的回调函数(在回调函数中C端首先要Lock自己的信号量A),这时C端的另外一个线程正好要调用S端的接口取得数据,C首先Lock住自己的信号量A,然后将要调用S端的接口(S的接口中要Lock信号量C)。

很明显这样就出现了相互等待的情况而出现死锁。

上面出现的死锁,问题实际上是出在客户端,如果客户端在回调函数中,和在调用服务器端接口的时候使用不同的信号量就可以避免死锁了。

使用回调函数还要注意性能问题,在回调函数中不能有很浪费时间的处理,道理和上面一样,要知道回调函数本身被调用是占用服务器端的线程的,服务器端还要处理自己要做的事情,并且不是只为一个客户端来服务,如果这个服务器的资源长时间被这个回调函数占用的话,对整个系统来说都是不好的。

和上面问题一样,在客户端来个线程切换就可以解决这个问题。


add callback function 添加回调函数 add callback function 添加回调函数》这是一个NX二次开发官方小例子,下面是代码和解析。相较于混乱、未经验证的代码,官方案例能够确保开发者获得准确的开发方法,这些官方示例代码经过严格测试,能够正确地反映出NX软件的功能和API使用方式,有助于开发者系统地掌握NX二次开发技能,提高开发质量和效率。本专栏订阅后是永久阅读的。欢迎一起学习NX二次开发案例,逐步积累宝贵的经验,早日成为行业专家。 阅读详情

相关推荐

微信聊天记录解密,必须是root的手机

手机上安装x-plore软件,将/data/data目录的相关EnMicroMsg.db auth_info_key_prefs.xml拷贝到/storge/emulated/0目录后才可以拷贝到电脑。路径:/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml。但是是加密过的 需要解密 解密密码生成规则是手机IMEI+微信UIN md5(32位小写)后的前7位。安卓手机要root测试版本微信要7或者8版本都可以。选择message表。

venus60的专栏 999

刚遇到的一个C#中调用api,回调函数的问题

       前天调试自己的一段代码,总是出错,用断点单步调试,发现执行完一个直接调用api的方法就出错了,加try-catch捕获不到,每次都是弹出窗口,提示“未将对象引用到实例”。为了这个错误,调了一个下午,结果公司的一位高手帮我调试,马上就指出了问题所在,那就是因为出错的方法执行完之后,api要执行回调函数,但是我的委托对象是作为局部变量注册到api中的,结果api调用的时候已经被释放了,结

bestshl的专栏 1588

【驱动适配】高通sa522平台tac5x1x驱动适配全指南

本手册详细介绍了TAC5301-Q1音频编解码器在高通sa525平台Linux系统下的驱动适配流程。主要内容包括:1)TAC5301-Q1核心特性(车载级音频Codec、关键接口和功能);2)驱动适配依赖(高通声卡驱动、ALSA SoC框架等);3)I2S协议原理及主从模式说明;4)硬件准备与检查要点;5)完整的驱动移植步骤(代码移植、Kconfig/Makefile修改、设备树配置)。该手册适用于嵌入式音频开发工程师快速完成TAC5301-Q1芯片的驱动移植与验证工作。

嵌入式博哥的博客 299

Callback Function(回调函数)

回调函数

2401_82469419的博客 1444

【k8s面试】超详细kubernetes面试题总结,面试必问!(附200道K8s Docker面试真题+答案详解

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

2401_83620959的博客 1453

手把手教你用TBtools+MCScanX完成玉米基因家族共线性分析(附完整代码)

本文提供了一套完整的玉米基因家族共线性分析实战流程,详细讲解了如何从数据准备、格式处理开始,利用DIAMOND进行快速比对,再结合MCScanX进行核心共线性区块鉴定,最后通过TBtools实现从全基因组圈图到特定基因家族微共线性图的可视化。教程包含可直接运行的代码与常见问题解决方案,帮助研究者高效完成从命令行计算到图形化展示的全过程。

tech5的博客 589

什么是回调函数(callback function)?

什么是回调函数(callback function)?

商务合作欢迎私信我 8066

【100%通过率】华为od统一考试B卷【需要打开多少监视器】JAVA&Go 实现

某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开:给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器

MISAYAONE的博客 9998

回调函数 callback function

先简单理解它的功能,打个比方,有一家旅馆提供叫醒服务,但是要求旅客自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇盆水。这里,“叫醒”这个行为是旅馆提供的,相当于库函数,但是叫醒的方式是由旅客决定并告诉旅馆的,也就是回调函数。而旅客告诉旅馆怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为登记回调函数(to register a cal

abc58396683的博客 700

使用Python与OpenCV实现基于霍夫变换的圆形缺陷检测与定位详细教程

本文详细探讨了如何使用Python和OpenCV库,通过图像边缘检测和霍夫变换实现圆形对象的检测与缺陷定位。我们不仅介绍了算法的基本原理,还通过具体的代码示例展示了如何在实际应用中实现这些技术。对于工业检测和医学影像分析,本文的方法提供了高效且易于实现的解决方案。随着图像处理技术的不断发展,未来我们可以期待更多新算法和新技术的应用,如深度学习与传统方法的结合,以及多传感器融合技术的引入,这将进一步提升缺陷检测与定位的效率和准确性。

qq_38334677的博客 1293

深入详细分析Skyworks 78113 PAMiD射频方案图

是一种高集成度的射频前端模块,它结合了功率放大器(PA)、双工器(Duplexer)、滤波器和开关等多个组件,主要用于4G LTE移动通信系统中的射频前端链路。是一款典型的PAMiD模块,通过将多个频段的发射(TX)和接收(RX)路径集成在一个模块中,大大减少了传统射频设计中的分立器件,同时提高了信号链路的效率和可靠性。模块化设计的优势PCB空间优化:高集成度设计大幅减小了射频电路的尺寸,适用于紧凑型移动设备。减少设计复杂度:模块化设计减少了器件间的匹配与调试工作,加速产品开发周期。性能稳定性。

weixin_43199439的博客 1477

回调函数(Callback Function)

回调函数(Callback  Function)什么是回调函数?    回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsA

zhangxin2208的专栏 3230

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

什么是回调函数(callback function)

生动的描述: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。

代码菌的blog 2万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

回调函数(Callback Function)

在 C++ 中,回调函数通常指一个函数作为参数传递到另一个函数中,当某个事件发生时,被调用的函数会“回调”传入的函数。回调函数就是一个通过参数传递到其他函数中的函数,通常由目标函数在某个特定时机被调用。回调函数是一种允许你将函数作为参数传递的机制,通常用于实现灵活的事件处理、异步操作和函数封装。你可以通过传入回调函数的方式,在数据到达时执行回调。Lambda 表达式是 C++11 引入的匿名函数,具有简洁的语法和强大的功能,尤其适合用作回调函数。通过函数对象,可以更加灵活地定义回调函数,并且可以持有状态。

TsuanS13的博客 1948

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++回调函数 callback function()

mark一下学习笔记,加深印象! 1.软件系统的分层: 在我们遇到的实际算法工程项目中,我们希望整个软件系统的分层如下图所示: 应用层:位于最上层,也就是提供给用户的功能接口,例如人脸活体检测接口。可以供用户的main函数直接调用,依赖于中间层 中间层:位于中间层,为应用层的功能函数提供动态库函数接口,例如综合多种人脸活体检测算法的接口,依赖于底层算法层 底层:位于最底层,为中间层提供需要单种算法sdk 分层后,我们希望函数调用关系都是从上到下,以确保单向依赖! 为啥要保证单向依赖?这样做的好处,可以.

weixin_42096202的博客 1827

C语言中callback回调函数,C语言中的回调函数(Callback Function)

1 定义和使用场合回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。简单来说,就是由别人的函数运行期间来回调你实现的函数。这一设计允许了底层代码调用在高层定义的子程序(如图1-1所示)。C...

weixin_28366053的博客 988

回调函数 Callback Function

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。  (1)定义一个回调函数;  (2)提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;  (3)当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。

I&U 654

回调函数callback function

原文:http://www.rosoo.net/a/200611/6372.html 简单的说,如果你使用了某个function,那麽你就是『call』了一个function。如果系统或是函式是要求你给一个function pointer,这个function pointer指到一个实际的函式(多半这个函式是你自己写的)。然後它会在适当的时间呼叫此function,则此function就

grantxx的专栏 2346

回调函数callback function的机制及使用举例

如果把函数指针传递给另一个函数(调用者),当调用者执行时,函数指针所指的函数也被执行。被调用的函数就是回调函数。 回调函数实现的机制是 1、定义一个回调函数;  2、提供函数实现的一方在初始化的时候,通过注册函数 向调用者(管理单元/调度函数)注册回调函数的函数指针。  3、当特定的事件发生时候,调用者使用函数指针调用回调函数对事件进行处理。 举例: Quagga0.9.22中OSPF...

刘一凡的博客 7851

【Linux C】回调函数(Callback function)

关于回调函数,感觉C语言回调函数详解 - 江召伟 - 博客园 (cnblogs.com)这篇文章讲述的非常好,感谢原作者的分享。 1. 什么是回调函数? 网上众说纷纭,看了很多都没理解到位。下面列出 Wiki 和 Stack Overflow 上的表述。 Wiki 对回调(Callback)的解析:In computer programming, a callback is any executable code that is passed as an argument to other cod..

老农民娃哈哈的博客 1652

理解一下回调函数Callback Function

在知乎上看到一个很好的解释用来理解回调函数的过程。 大致是说 你去宾馆了然后向前台告知明天六点叫我起床,这句话就大致说明了两个Function 1.我请求叫醒服务 2.宾馆记录下来到具体时间点叫醒你。 这里说明一下:就是你去约定一个时间点之后或者给个标志什么的 当条件满足的时候 宾馆方面就执行方法二,在条件未满足之前你可以去做任何事,不妨碍宾馆方面的执行。 用代码实现这里的逻辑如下:

Chauncymaster的博客 1766

callback function 回调函数

回调函数   在看LWIP时,见到用回调函数,再看某老外公司OPC源代码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了很大的好奇。以前,我写VC程序时用到过回调函数,但是没有用C语言来使用。最近,看到国外大量的经典代码中广泛使用了回调函数(LWIP、某两个公司的OPC程序等),都是C语言来实现的,而不是VC windows程序中别人实现自己使用的那种。

crazy_programmer_p的专栏 724

callback function(回调函数)

简单的说,我们调用别人的API叫call,调用的第三方api调用我们的函数叫回调(callback) call与callback 回调机制 比如,要拷贝一个文件,将1.pdf拷贝成1_copy.pdf。。。 方法:调用Windows API(系统函数库) 里面有一个CopyFile函数 CopyFile("1.pdf", "2.pdf" ... ); 这种调...

nicebluechai的博客 5770

C语言中的回调函数(Callback Function)

1 定义和使用场合 回调函数是指 使用者自己定义一个函数,实现这个函数的程序内容,然后把这个函数(入口地址)作为参数传入别人(或系统)的函数中,由别人(或系统)的函数在运行时来调用的函数。函数是你实现的,但由别人(或系统)的函数在运行时通过参数传递的方式调用,这就是所谓的回调函数。简单来说,就是由别人的函数运行期间来回调你实现的函数。 这一设计允许了底层代码调用在高层定义的子程序(如图1...

sinat_41625153的博客 554

深入了解回调函数(Callback Function)

回调函数(Callback Function)是编程中非常重要的概念,尤其在事件驱动编程和异步编程中广泛应用。它不仅增强了代码的灵活性和可重用性,还为我们提供了一种处理复杂操作的优雅方式

卖蘑菇滴小男孩得博客 1280
上一篇: 二级指针数组小例
下一篇: 有意思的小程序
kingtutu626
博客等级 码龄16年 1粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值