今天在看一个多线程下载文件的代码时,让我很头痛。因为该程序中运用了大量的回调函数。

在我们学习一种技术的时候我们就要去知道几个问题

1.        回调函数是什么东西?

2.        回调函数怎么开发,怎么使用?

3.        回调函数的作用,应该在什么情况下使用?

什么是回调函数?
  回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。

回调函数的使用:

一般定义说的很专业,就是因为太专业让我们这种小学还没有毕业的人学的很无奈。简单来说就是定义个函数指针

1: void (*)fun( int sb1, int sb2)。

2:   void funSb( int sb1, int sb2)

3: fun = funSb;

4: fun(4, 5);

在第四步的时候就程序就调用了FunSb( int sb1, int sb2)函数。

回调函数的作用,以及在什么情况下应该使用?

技术的使用的关键点,就在与这个问题是怎么理解的。之前在学习的时候只知道硬性的学习,学完之后只会用,但是在编写过的程序里面使用率为0%。这就是没有把技术学透。首先先看下CSDN中大家讨论的答案。

我们对回调函数的使用无非是对函数指针的应用,函数指针的概念本身很简单,但是把函数指针应用于回调函数就体现了一种解决问题的策略,一种设计系统的思想。
在解释这种思想前我想先说明一下,回调函数固然能解决一部分系统架构问题但是绝不能再系统内到处都是,如果你发现你的系统内到处都是回调函数,那么你一定要重构你的系统。回调函数本身是一种破坏系统结构的设计思路,回调函数会绝对的变化系统的运行轨迹,执行顺序,调用顺序。回调函数的出现会让读到你的代码的人非常的懵头转向。

那么什么是回调函数呢,那是不得以而为之的设计策略,想象一种系统实现:在一个下载系统中有一个文件下载模块和一个下载文件当前进度显示模块,系统要求实时的显示文件的下载进度,想想很简单在面向对象的世界里无非是实现两个类而已。但是问题恰恰出在这里,显示模块如何驱动下载进度条?显示模块不知道也不应该知道下载模块所知道的文件下载进度(面向对象设计的封装性,模块间要解耦,模块内要内聚),文件下载进度是只有下载模块才知道的事情,解决方案很简单给下载模块传递一个函数指针作为回调函数驱动显示模块的显示进度。

在面向对象的世界中这样的例子还真不少,造成这样的问题的根源,相信大家已经从上面的叙述中体会到了,就是面向对象的程序设计思想,就是设计模式中要求的模块独立性,高内聚低耦合等特性。

封装变化的编程策略给编程人员第一位的指导思想就是面向接口编程米,即设计模式中提到的面向虚拟编程而不是面向实现。这样的编程思想极大地革新了编程世界,可以说没有这一原则就没有面向对象的程序设计,这一原则给程序设计一种指导思想即如何更高的将现实模型映射成程序模型。这样的设计思想在极大地催生高度独立性模块的同时削弱了模块间的协作性,也就是耦合性,它使得模块间更多的从事着单向的调用工作,一个模块需要某种服务就去找另一个模块,这使得程序呈现出层次性,高层通过接口调用底层,底层提供服务。但是现实世界中严格遵循现层次特性的系统是很少见的,绝对的MVC是不存在的,因为更多的模块要求通并协作,可见没有耦合就没有协作没有好的调用关系,耦合真的不是错。

既然我们需要模块间的协作,同时我们又厌恶的摒弃模块间你中有我我中有你的暧昧关系那如何生成系统呢,答案是函数指针(不一定一定是函数指针)也就是使用回调的方式。如果一个对象关心另一个对象的状态变化那么给状态的变化注册回调函数让它通知你这类状态的改变,这样在封装了模块变化的同时实现了模块间的协作关系另辟独径的给对象解耦。

这个哥们说的很专业。网页的地址为:http://bbs.csdn.net/topics/390081829 。主要是16楼的答案。

该段文字说的很专业,对于我这种菜鸟来说理解有点问题。不过读了几遍就有点理解。我的例子:

基于对话框的文件下载程序。 在生成的代码中主要使用WSAeventSelect模型监听套接字。新建一个类负责接收数据的处理。

这时,如果我要使用接收数据类中的某个函数是不是先要产生一个类的实例才可以使用。这时我们就可以使用回调函数,首先在对话框类中定义一个函数指针,接着就可以使用回调函数的机制了。这就是红色部分所说的

我们需要模块间的协作,同时我们又厌恶的摒弃模块间你中有我我中有你的暧昧关系那如何生成系统呢,答案是函数指针

我的C++回调函数的理解相关推荐

  1. Java 回调函数的理解

    以下是我对java回调函数的理解,希望对各位有帮助. 简而言之,假设有两个类A与B,还有一个回调接口C(有一个c方法).其中A类持有一个B类对象作为属性和拥有一个a方法,并实现了接口C,所以A类中就有 ...

  2. js回调函数的理解(轉)

    js回调函数(callback)理解Mark!讲之前说一句function say(){alert(,,,,,,,,)}var say=function (){alert(,,,,,,,)}var s ...

  3. 回调函数举例ajax,通过回调函数的理解来进一步理解ajax及其注意的用法

    一,再一次理解回调函数 (function($){ $.fn.shadow = function(opts){ //定义的默认的参数 var defaults = { copies: 5, opaci ...

  4. 对于Python中回调函数的理解

    关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述.我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解. 这是360百科的解释: 在计算机程序设计中 ...

  5. 对“回调函数”的理解

    举例说明 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的 电话号码 就叫 回调函 ...

  6. js中回调函数的理解 举例说明js回调函数

    初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function that is passed as an arg ...

  7. 回调函数 简单理解

    初学js的时候,被回调函数搞得很晕,现在回过头来总结一下什么是回调函数. 我们先来看看回调的英文定义:A callback is a function that is passed as an arg ...

  8. javascript中回调函数的理解和应用

    一. 什么是回调函数? 被作为实参传入另一函数,并在该外部函数内被调用,用以来完成某些任务的函数,称为回调函数. function f1(fn) {let a =1;console.log(a,'a' ...

  9. Java回调函数的理解

    所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C ...

最新文章

  1. rabbitmq 查询版本_基于rabbitmq解决分布式事务
  2. 【Flutter】底部导航栏页面框架 ( BottomNavigationBar 底部导航栏 | PageView 滑动页面 | 底部导航与滑动页面关联操作 )
  3. 个性化 服务器运行失败,VirtualBox 运行失败
  4. 数据分析系统数据库选型
  5. 三菱m70刀杯上下m代码_加工中心常用G代码和M代码大全,收藏好了
  6. 4步精准诊断“门店数字化”问题,助力门店起死回生
  7. mysql安装失败net_mysql安装后.net程序运行出错的解决方法
  8. gis核密度分析工具_核密度分析工具的初探(Kernel Density)
  9. python xls和xlsx互转
  10. 电商平台“阿里巴巴关键词搜索”api接口调用展示
  11. 我的MATLAB学习之路
  12. c 语言多个if并联使用,if的嵌套和多个并列if的效率有关问题
  13. robotframework之解决导入httplibrary库一直标红的问题
  14. 欧氏距离与余弦距离的关系
  15. MySQL复制跳过错误--slave_skip_errors、sql_slave_skip_counter、slave_exec_mode
  16. 克隆远程仓库#180804
  17. 开源之夏 | 阿里开源近百任务上线,顶级导师万元奖金等你
  18. 设置windows10相应文件格式的打开方式
  19. 新风系统风速推荐表_新风系统该如何选择管径、计算风速与全压?
  20. JVM-GC算法及垃圾收集器超级详细解读(520 是什么? 不存在)

热门文章

  1. 作业盒子生端AndrOid,作业盒子小学学生端
  2. 怎么快速调节EDIUS中声音的淡入淡出?
  3. ffi Error:Dynamic Linking Error:Win32 error 126
  4. XX图文扩容配置说明
  5. 启动SpringBoot报错:Field userService in com.sunshin.controller.UserController required a bean of type...
  6. 执行npm run dev 报错 vue-element-admin@4.2.1 dev: `vue-cli-service serve`
  7. python3.7安装scrapy_Python3.7下scrapy框架的安装
  8. windows安装python虚拟环境_windows上安装python虚拟环境
  9. python3.6安装scrapy出错_python3.6安装scrapy
  10. UNION 和 UNION ALL的区别