回调函数

结构体中定义函数指针

做~自己de王妃 提交于 2020-01-30 11:10:10
结构体指针变量的定义 定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct 结构体标识符 {   成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化:struct 结构体标识符 变量名={初始化值1,初始化值2,…,初始化值n }; 形式2:在定义类型的同时定义变量 struct 结构体标识符 {   成员变量列表;… } *指针变量名; 形式3:直接定义变量,用无名结构体直接定义变量只能一次 struct {   成员变量列表;… }*指针变量名; 其中“指针变量名”为结构体指针变量的名称。形式1是先定义结构体,然后再定义此类型的结构体指针变量;形式2和形式3是在定义结构体的同时定义此类型的结构体指针变量。 函数指针的定义 一般的函数指针可以这么定义:    int (*func)(int,int); 表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数: int add2(int x,int y) {   return x+y; } 那么在实际使用指针func时可以这样实现: func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同 printf("func(3,4)=%d\n",func(3,4)); 事实上,为了代码的移植考虑

ros多线程数据处理方法(在主函数中循环处理消息与回调函数循环冲突解决方法)

一曲冷凌霜 提交于 2020-01-29 11:36:13
在ros节点中,主函数中不能设置长时间的循环,否则会影响回调函数的执行 主函数如下 #include <iostream> #include "senser_bridge.h" #include "nav.h" int main(int argc, char *argv[]) { ros::init(argc,argv,"nav_test"); ROS_INFO("*******"); SenserBridge senser_bridge; while(true){ cout << "主函数" <<endl; sleep(1); } ros::spin(); } SenserBridge类如下 SenserBridge::SenserBridge() { imu_sub_ = nh_.subscribe("/insprobe/imu0", 200, &SenserBridge::ImuDataCollect, this); pose_pub_ = nh_.advertise<sensor_msgs::PointCloud2>("/pose",200); } //回调函数 void SenserBridge::ImuDataCollect(const sensor_msgs::Imu::ConstPtr &msg) { sensor_msgs::Imu imu_data; imu

回调函数机制

给你一囗甜甜゛ 提交于 2020-01-28 07:26:55
首先创建一个d_ptr_app.cpp #include<iostream> #include<ptr_app.h> #include<ros/ros.h> int main(int argc, char** argv) { ros::init(argc, argv, "davidhan_Ptr"); ros::NodeHandle nh("~"); d_ptr_app ptr_app_(nh); ros::spin(); return 0; } 然后对应的头文件ptr_app.h #ifndef PTR_APP_H #define PTR_APP_H #include <iostream> #include <memory> #include <ptr.h> #include <ros/ros.h> #include <std_msgs/UInt32.h> class d_ptr_app { public: d_ptr_app(ros::NodeHandle& nh):app_i(1) { //nh_=nh; d_ptr_=std::make_shared<d_ptr>(app_i);//传入参数 //括号的参数传递要一致 d_ptr_->setDPtrCallback(std::bind( &d_ptr_app::DPtrHander, this, std:

python 高性能编程之协程

独自空忆成欢 提交于 2020-01-27 08:24:38
用 greenlet 协程处理异步事件 自从 PyCon 2011 协程成为热点话题以来,我一直对此有着浓厚的兴趣。为了异步,我们曾使用多线程编程。然而线程在有着 GIL 的 Python 中带来的性能瓶颈和多线程编程的高出错风险,“协程 + 多进程”的组合渐渐被认为是未来发展的方向。技术容易更新,思维转变却需要一个过渡。我之前在异步事件处理方面已经习惯了回调 + 多线程的思维方式,转换到协程还非常的不适应。这几天我非常艰难地查阅了一些资料并思考,得出了一个可能并不可靠的总结。尽管这个总结的可靠性很值得怀疑,但是我还是决定记录下来,因为我觉得既然是学习者,就不应该怕无知。如果读者发现我的看法有偏差并指出来,我将非常感激。 多线程下异步编程的方式 线程的出现,为开发者带来了除多进程之外另一种实现并发的方式。比起多进程,多线程有另一些优势,比如可以访问进程内的变量,也就是共享资源。还有的说法说线程创建比进程创建开销低,考虑到这个问题在 Windows 一类进程创建机制很蹩脚的系统才存在,故先忽略。总的来说,线程除了可以实现进程实现的“并发执行”之外,还有另一个功能,就是管理应用程序内部的“事件”。我不知道把这种事件处理分类到异步中是不是合适,但事件处理一定是基于共享进程内资源才能实现的,所以这是多线程可以做到而多进程做不到的一点。 异步处理基于两个前提。第一个前提是支持并发

AMD规范

蓝咒 提交于 2020-01-27 07:52:01
common.js主要语法就是 var math=require('math'); math.add(2,3); require()用于加载模块就行了。 二行math.add(2, 3),在第一行require('math')之后运行,因此必须等math.js加载完成。也就是说,如果加载时间很长,整个应用就会停在那里等。 这对服务器端不是一个问题,因为所有的模块都存放在本地硬盘,可以同步加载完成,等待时间就是硬盘的读取时间。但是,对于浏览器,这却是一个大问题,因为模块都放在服务器端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于"假死"状态。 因此,浏览器端的模块,不能采用"同步加载"(synchronous),只能采用"异步加载"(asynchronous)。这就是AMD规范诞生的背景。 AMD全称Asynchronous,意思就是"异步模块定义“”,用于异步加载,回调函数加载完需要的模块再来加载自定义语句,即它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。 将上面的require()函数修改为AMD规范即是 require(['math'],function(math){ math.add(2,3)}) math.add()与math模块加载不是同步的,浏览器不会发生假死

线程的APC机制

谁都会走 提交于 2020-01-26 22:30:26
当系统创建一个线程的时候,会同时创建一个与线程相关的队列。这个队列被叫做异步过程调用(APC)队列。 为了对线程中的APC队列中的项进行处理,线程必须 将自己设置为可提醒状态,只不过意味着我们的线程在执行的时候已经到达了一个点,在这个点上它能够处理被中断的情况,下边的六个函数能将线程设置为可提醒状态: BOOL SleepEx(); DWORD WaitForSingleObjectEx(); DWORD WaitForMultipleOBjectsEx(); BOOL SingalObjectAndWait(); BOOL GetQueuedCompletionStatusEx(); //这五个函数的最后一个参数是BOOL值,表示是否设置为可提醒状态。 DWORD MsgWaitForMultipleObjectsEx(); //最后一个参数设置为MWMO_ALERTABLE 标志 当我们调用上边的六个函数之一并将线程设置为可提醒状态的时候,系统首先会检查线程的APC队列,如果队列中至少有一项,那么系统就不会让线程进入睡眠状态。系统将会把那一项取出来并让线程执行与之相关的回调函数。当回调函数返回的时候,会再次检查APC队列中是否还有其他项,如果还有就继续处理,如果没有,对于可提醒函数的调用将会返回。这个是在前边APC中有一项的基础上。 但是当在刚调用函数时

一款实用的viewer.js 图片相册

只愿长相守 提交于 2020-01-26 20:27:15
Viewer.js 是一款强大的图片相册插件,像SNS交友网站一般都会用到点击缩略图,弹出层大图片,而且弹出层有多个控制按钮,比如放大缩小、旋转、撤回等,底部有缩略图列表可切换。 支持移动设备触摸事件 支持响应式 支持放大/缩小 支持旋转(类似微博的图片旋转) 支持水平/垂直翻转 支持图片移动 支持键盘 支持全屏幻灯片模式(可做屏保) 支持缩略图 支持标题显示 支持多种自定义事件 在线实例 默认效果 jQuery版本 回调函数 自定义方法 使用方法 <ul id="sucaihuo"> <li><img data-original="img/tibet-1.jpg" src="img/thumbnails/tibet-1.jpg" alt="图片1"></li> <li><img data-original="img/tibet-2.jpg" src="img/thumbnails/tibet-2.jpg" alt="图片2"></li> <li><img data-original="img/tibet-3.jpg" src="img/thumbnails/tibet-3.jpg" alt="图片3"></li> <li><img data-original="img/tibet-4.jpg" src="img/thumbnails/tibet-4.jpg" alt="图片4">

使用requireJs进行模块化开发

删除回忆录丶 提交于 2020-01-26 17:37:08
requireJs使用 requireJs 使用require.js的第一步,是先去官方网站下载最新版本。 下载后,假定把它放在js子目录下面,就可以加载了。 <script src="js/require.js"></script> 有人可能会想到,加载这个文件,也可能造成网页失去响应。解决办法有两个,一个是把它放在网页底部加载,另一个是写成下面这样:  <script src="js/require.js" defer async="true" ></script> async属性表明这个文件需要异步加载,避免网页失去响应。IE不支持这个属性,只支持defer,所以把defer也写上。 加载require.js以后,下一步就要加载我们自己的代码了。假定我们自己的代码文件是main.js,也放在js目录下面。那么,只需要写成下面这样就行了:  <script src="js/require.js" data-main="js/main"></script> data-main属性的作用是,指定网页程序的主模块。在上例中,就是js目录下面的main.js,这个文件会第一个被require.js加载。由于require.js默认的文件后缀名是js,所以可以把main.js简写成main。 主模块的写法 上一节的main.js,我把它称为"主模块",意思是整个网页的入口代码

2020最新版C/C++学习路线图--C高级编程重点知识

点点圈 提交于 2020-01-25 18:31:41
黑马程序员C/C++学习路线图大纲中第二阶段的学习是C高级编程的学习:主要介绍了C/C++学习路线图的C高级编程的学习目标,C/C++学习路线图的C高级编程的市场价值,C/C++学习路线图的C高级编程的重点知识。 C/C++学习路线图中的C高级编程部分的学习视频可以在黑马程序员视频库中找到自学教程。 C/C++学习路线图中C高级编程的技术要点: 内存分区、函数调用模型;指针高级;函数指针与回调函数;数据结构与链表;递归函数;接口的封装和设计;数据结构与算法。 内存分区、函数调用模型 1.数据类型、变量的含义 2.内存四区特点 3.函数的调用模型 4.内存操作函数 5.宏定义与预处理 指针高级 1.指针基本使用 2.指针的步长的概念 3.指针简介赋值 4.指针以及多级指针做函数参数的特性与使用 5.通过指针操作字符串 6.const类型修饰符 7.位的逻辑运算符 8.移位运算符 9.数组指针与指针数组 10.多维数组做函数参数 11.结构体嵌套一级指针 12.结构体嵌套二级指针 13.浅拷贝深拷贝 函数指针与回调函数 1.封装和设计的思想 2.函数指针定义的三种方式 3.回调函数 数据结构与链表 1.链表的基本概念 2.单链表的相关操作 递归函数 1.递归函数的概念 2.递归的使用 接口的封装和设计 1.函数的封装设计 2.解耦合的设计理念 3.模块实现与业务分离的思想

Node之创建与读取目录

故事扮演 提交于 2020-01-25 02:24:36
创建目录 在fs模块中,可以使用mkdir方法创建目录 fs.mkdir(path,[mode],callback path:用于指定需要被创建的目录的完整路径及目录名; mode:用于指定该目录的权限,默认值为0777(表示任何人可读写该目录); callback:该回调函数中使用一个参数,参数值为创建目录操作失败时触发的错误对象。 同步创建目录 fs.mkdirSync(path,[mode]) 读取目录 在fs模块中,可以使用readdir方法读取目录 fs.readdir(path,callback) path:读取的文件路径 callback:数用于指定读取目录操作完毕时调用的回调函数,在该回调函数中使用两个参数,其中第一个参数值为读取目录操作失败时触发的错误对象,第二个参数值为一个数组,其中存放了读取到的文件中的所有文件名。 同步读取 fs.readdirSync(path) 查看文件或目录的信息 在fs模块中,可以使用stat方法或lstat方法查看一个文件或目录的信息。这两个方法的唯一区别是当查看符号链接文件的信息时,必须使用lstat方法。 fs.stat(path, callback) fs.lstat(path, callback) path:文件路径 callback:在该回调函数中,使用两个参数,其中err参数值为查看文件或目录信息操作失败时触发的错误对象