当前位置: 首页 > news >正文

C++笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec()

C++笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec()

code review!

参考笔记
1.qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面
2.qt-C++笔记之QThread使用
3.qt-C++笔记之多线程架构模式:事件信号监听线程中除了while循环外让线程一直活着的方法(笔记一)
4.qt-C++笔记之多线程架构模式:事件信号监听线程中除了while循环外让线程一直活着的方法(笔记二)
5.ROS笔记之ros::spin()、ros::spinOnce()的区别
6.C++笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec()

文章目录

  • C++笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec()
    • 1. `io.run()`(Boost.Asio)
      • 功能
      • 退出条件
      • 特点
    • 2. `ros::spin()`(ROS 框架)
      • 功能
      • 退出条件
      • 特点
    • 3. `app.exec()`(Qt 框架)
      • 功能
      • 退出条件
      • 特点
    • 4.对比表格
    • 5.为什么 `io.run()` 会主动退出,而其他两个不会?
    • 6.如何让 `io.run()` 不主动退出?

1. io.run()(Boost.Asio)

功能

  • io.run() 是 Boost.Asio 中的事件循环函数,用于处理异步操作和事件。它会以同步方式运行,直到所有已注册的异步操作(包括定时器、网络 I/O 和其他事件)完成。
  • 具体行为:
    1. 等待事件(如定时器到期、异步 I/O 操作完成)。
    2. 当事件触发时,调用相应的回调函数。
    3. 如果没有更多的事件或异步操作可处理,io.run() 会自动退出。

退出条件

  • 没有活跃的异步操作:如果所有注册的异步任务(如定时器、异步 I/O 等)都完成,io.run() 会退出。
  • 手动停止:可以通过调用 io_context::stop()io_service::stop() 主动停止事件循环,使 io.run() 立即退出。

特点

  • io.run() 会根据注册的异步操作动态决定其生命周期。当没有更多事件需要处理时,它将主动退出,以实现高效资源管理。

2. ros::spin()(ROS 框架)

功能

  • ros::spin() 是 ROS(Robot Operating System)中的事件循环函数,用于处理 ROS 节点的回调事件(如消息订阅、服务请求)。
  • 具体行为:
    1. 等待 ROS 事件(如消息到达、定时器触发)。
    2. 当事件触发时,调用相应的回调函数。
    3. 持续运行,直到收到退出信号。

退出条件

  • 手动退出
    • 调用 ros::shutdown() 显式终止事件循环。
    • 或者按下 Ctrl+C,触发 SIGINT 信号,ROS 会自动调用 ros::shutdown()
  • ROS Master 断开:如果 ROS 节点与 ROS Master 的连接丢失,ros::spin() 可能会退出。

特点

  • io.run() 不同,ros::spin() 的设计目的是持续运行,以保持节点对 ROS 消息和事件的监听。因此,它不会因为没有事件处理而主动退出。

3. app.exec()(Qt 框架)

功能

  • app.exec() 是 Qt 框架中的事件循环函数,用于运行 GUI 应用程序的主事件循环。它负责处理用户输入(如鼠标点击、键盘输入)、定时器事件、窗口渲染等。
  • 具体行为:
    1. 运行事件循环,监听和分发系统事件(如用户输入事件)。
    2. 当事件触发时,调用对应的槽函数或回调函数。
    3. 保持运行,直到应用程序退出。

退出条件

  • 显式退出
    • 调用 QCoreApplication::quit()QApplication::exit(),退出事件循环。
    • 用户关闭主窗口(如果设置了关闭主窗口会退出应用的逻辑)。
  • 系统强制终止:如任务管理器强制关闭程序。

特点

  • ros::spin() 类似,app.exec() 的事件循环设计为持续运行,以确保 GUI 应用程序能够实时响应用户输入。

4.对比表格

框架核心函数是否持续监听持续监听的条件
Boost.Asioio_context::run()有条件地持续需有未决异步操作保有executor_work_guard对象
ROSros::spin()节点未关闭,持续运行
QtQApplication::exec()应用程序未退出,事件循环自动运行

5.为什么 io.run() 会主动退出,而其他两个不会?

  • 设计目的不同

    • io.run() 的设计目的是高效处理异步操作,并在没有更多事件需要处理时立即退出,以节省资源。
    • ros::spin()app.exec() 的设计目的是保持程序运行以持续监听事件(如用户输入或 ROS 消息),因此不会主动退出。
  • 事件循环的生命周期管理

    • io.run() 中,事件循环的生命周期由当前注册的异步操作决定。如果没有活跃的异步操作,事件循环自动结束。
    • ros::spin()app.exec() 中,事件循环的生命周期与程序的整体生命周期绑定,不会因为没有事件处理而退出。

6.如何让 io.run() 不主动退出?

如果希望 io.run() 的事件循环一直运行,可以确保至少有一个活跃的异步操作。以下是几种常见方法:

  1. 保持活跃的异步操作

    • 确保在异步任务完成后,重新启动新的异步操作。例如,在定时器到期后,继续重新设置计时器。
  2. 使用空闲工作对象

    • 使用 boost::asio::executor_work_guardboost::asio::io_service::work 保持 io_context 活跃,即使没有其他异步操作:
      boost::asio::io_context io;
      auto work = boost::asio::make_work_guard(io);io.run();  // 不会主动退出
      
  3. 定时器循环调用

    • 使用定时器在事件循环内持续触发事件:
      void keepAlive(boost::asio::steady_timer& timer) {timer.expires_after(std::chrono::seconds(1));timer.async_wait([&](const boost::system::error_code& error) {if (!error) {std::cout << "Still running..." << std::endl;keepAlive(timer);  // 重新启动定时器}});
      }
      

通过这些方法,可以防止 io.run() 提前退出,使事件循环持续运行并监听事件。

相关文章:

C++笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec()

C笔记之不同框架中事件循环的核心函数&#xff1a;io_run()、ros_spin()、app_exec() code review! 参考笔记 1.qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面 2.qt-C笔记之QThread使用 3.qt-C笔记之多线程架构模式&#xff1a;事件信号监…...

C++异常处理

目录 一、异常的概念 二、异常的使用 &#xff08;1&#xff09;异常的抛出和捕获 &#xff08;2&#xff09;异常的重新抛出 &#xff08;3&#xff09;异常安全 &#xff08;4&#xff09;异常规范 三、自定义异常体系 四、c标注异常体系 五、异常的优缺点 在之前我们…...

【数据结构】哈希 ---万字详解

unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到log_2 N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好 的查询是&#xff0c…...

4399大数据面试题及参考答案(数据分析和数据开发)

对数据分析的理解 数据分析是一个从数据中提取有价值信息以支持决策的过程。它涵盖了数据收集、清洗、转换、建模和可视化等多个环节。 首先,数据收集是基础。这包括从各种数据源获取数据,例如数据库、文件系统、网络接口等。这些数据源可以是结构化的数据,如关系型数据库中…...

快速理解倒排索引在ElasticSearch中的作用

一.基础概念 定义&#xff1a; 倒排索引是一种数据结构&#xff0c;用来加速文本数据的搜索和检索&#xff0c;和传统的索引方式不同&#xff0c;倒排索引会被每个词汇项与包含该词汇项的文档关联起来&#xff0c;从而去实现快速的全文检索。 举例&#xff1a; 在传统的全文…...

C++趣味编程玩转物联网:基于树莓派Pico控制无源蜂鸣器-实现音符与旋律的结合

无源蜂鸣器是一种多功能的声音输出设备,与有源蜂鸣器相比,它能够通过不同频率的方波生成丰富多样的音调。本项目使用树莓派Pico开发板,通过编程控制无源蜂鸣器播放经典旋律《归来有风》。本文将详细介绍项目实现中的硬件连接、C++代码解析,以及无源蜂鸣器的工作原理。 一、…...

《RuoYi基于SpringBoot+Vue前后端分离的Java快速开发框架学习》系列博客_Part4_三模态融合

系列博客目录 文章目录 系列博客目录目标Step1:之前工作形成子组件Step2:弥补缺失的文本子组件&#xff0c;同时举例如何子组件向父组件传数据Step3:后端代码需要根据上传的文件传给python服务器Step4:python服务器进行分析 目标 实现三模态融合&#xff0c;将文本、图片、音频…...

springboot365高校疫情防控web系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;高校疫情防控的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为…...

STM32 USART串口数据包

单片机学习&#xff01; 目录 前言 一、数据包 二、HEX数据包 三、文本数据包 四、HEX数据包和文本数据包优缺点 4.1 HEX数据包 4.2 文本数据包 五、HEX数据包接收 六、文本数据包接收 总结 前言 本文介绍了串口数据包收发的思路和流程。 一、数据包 数据包的作用是把一个个单独…...

【LC】3232. 判断是否可以赢得数字游戏

题目描述&#xff1a; 给你一个 正整数 数组 nums。 Alice 和 Bob 正在玩游戏。在游戏中&#xff0c;Alice 可以从 nums 中选择所有个位数 或 所有两位数&#xff0c;剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和&#xff0c;则 Alice 获胜。如果…...

Linux基础学习--vi与vim

0.绪论 前面的内容基本学完了相关命令行&#xff0c;后面进行shell与shell script的学习。第一部分就是编辑器的学习&#xff0c;之前有写过vi/vim编辑器&#xff0c;但是我看了一下鸟哥这个非常详细&#xff0c;还是打算重头学习一下。 1.vi/vim的使用 一般命令模式(command…...

JavaScript 高级教程:异步编程、面向对象与性能优化

在前两篇教程中&#xff0c;我们学习了 JavaScript 的基础和进阶内容。这篇文章将带领你进入更深层次&#xff0c;学习 JavaScript 的异步编程模型、面向对象编程&#xff08;OOP&#xff09;&#xff0c;以及性能优化的技巧。这些内容对于构建复杂、流畅的前端应用至关重要。 …...

qt QToolBox详解

1、概述 QToolBox是Qt框架中的一个控件&#xff0c;它提供了一个带标签页的容器&#xff0c;用户可以通过点击标签页标题来切换不同的页面。QToolBox类似于一个带有多页选项卡的控件&#xff0c;但每个“选项卡”都是一个完整的页面&#xff0c;而不仅仅是标签。这使得QToolBo…...

翁知宜荣获“易学名师”与“国学文化传承人”称号

在2024年10月19日举行的北京第六届国学文化传承峰会上&#xff0c;翁知宜老师以其在易学界的卓越成就和对国学文化的传承与发扬&#xff0c;荣获“易学名师”和“国学文化传承人”两项荣誉称号。 翁知宜老师在易经学术竞赛中荣获第一名&#xff0c;其深厚的易学造诣和对玄学学…...

20241128解决Ubuntu20.04安装libwxgtk3.0-dev异常的问题

20241128解决Ubuntu20.04安装libwxgtk3.0-dev异常的问题 2024/11/28 16:17 缘起&#xff1a;中科创达的高通CM6125开发板的Android10的编译环境需要。 安装异常&#xff1a;rootrootrootroot-X99-Turbo:~$ rootrootrootroot-X99-Turbo:~$ sudo apt-get install libwxgtk3.0-de…...

sql分类

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系数据库管理系统&#xff08;RDBMS&#xff09;的编程语言。SQL 可以分为几个主要类别&#xff0c;每个类别都有其特定的用途和功能。以下是 SQL 的主要分类&#xff1a; 1. 数据定义语言&#x…...

stm32里一个定时器可以提供多路信号吗?

在STM32中&#xff0c;一个定时器通常只能提供一组信号&#xff08;如输出PWM波形、定时中断等&#xff09;。但是&#xff0c;定时器的多个通道可以提供不同的信号。例如&#xff0c;STM32的定时器可以通过不同的输出通道产生多种PWM信号&#xff0c;每个通道可以配置为不同的…...

Java安全—原生反序列化重写方法链条分析触发类

前言 在Java安全中反序列化是一个非常重要点&#xff0c;有原生态的反序列化&#xff0c;还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化&#xff0c;这部分内容对于没Java基础的来说可能有点难&#xff0c;包括我。 序列化与反序列化 序列化&#xff1a;将内存…...

2023考研王道计算机408数据结构+操作系统+计算机组成原理+计算机网络

from: https://blog.csdn.net/weixin_46118419/article/details/125611299 写得很好&#xff01; 轻重缓急 2023考研计算机408【王-道计算机408】数据结构操作系统计算机组成原理计算机网络 网盘-链接&#xff1a;https://pan.baidu.com/s/13JraxUYwNVPeupdzprx5hA?pwd5h3d 提…...

YOLOv8-ultralytics-8.2.103部分代码阅读笔记-files.py

files.py ultralytics\utils\files.py 目录 files.py 1.所需的库和模块 2.class WorkingDirectory(contextlib.ContextDecorator): 3.def spaces_in_path(path): 4.def increment_path(path, exist_okFalse, sep"", mkdirFalse): 5.def file_age(path__fi…...

「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器

本篇将带你实现一个颜色选择器应用。用户可以从预设颜色中选择&#xff0c;或者通过输入颜色代码自定义颜色来动态更改界面背景。该应用展示了如何结合用户输入、状态管理和界面动态更新的功能。 关键词 UI互动应用颜色选择器状态管理用户输入界面动态更新 一、功能说明 颜色…...

ELK(Elasticsearch + logstash + kibana + Filebeat + Kafka + Zookeeper)日志分析系统

文章目录 前言架构软件包下载 一、准备工作1. Linux 网络设置2. 配置hosts文件3. 配置免密登录4. 设置 NTP 时钟同步5. 关闭防火墙6. 关闭交换分区7. 调整内存映射区域数限制8. 调整文件、进程、内存资源限制 二、JDK 安装1. 解压软件2. 配置环境变量3. 验证软件 三、安装 Elas…...

07.ES11 08.ES12

7.1、Promise.allSettled 调用 allsettled 方法&#xff0c;返回的结果始终是成功的&#xff0c;返回的是promise结果值 <script>//声明两个promise对象const p1 new Promise((resolve, reject) > {setTimeout(() > {resolve("商品数据 - 1");}, 1000)…...

linux一键部署apache脚本

分享一下自己制作的一键部署apache脚本&#xff1a; 脚本已和当前文章绑定&#xff0c;请移步下载&#xff08;免费&#xff01;免费&#xff01;免费&#xff01;&#xff09; &#xff08;单纯的分享&#xff01;&#xff09; 步骤&#xff1a; 将文件/内容上传到终端中 …...

2022 年 6 月青少年软编等考 C 语言三级真题解析

目录 T1. 制作蛋糕思路分析T2. 找和最接近但不超过K的两个元素思路分析T3. 数根思路分析T4. 迷信的病人思路分析T5. 算 24思路分析T1. 制作蛋糕 小 A 擅长制作香蕉蛋糕和巧克力蛋糕。制作一个香蕉蛋糕需要 2 2 2 个单位的香蕉, 250 250 250 个单位的面粉, 75 75 75 个单位的…...

MySQL - Why Do We Need a Thread Pool? - mysql8.0

MySQL - Why Do We Need a Thread Pool? - mysql8.0 本文主要由于上次写的感觉又长又臭&#xff0c; 感觉学习方法有问题&#xff0c; 我们这次直接找来了 thread pool 的原文&#xff0c;一起来看看官方的开发者给出的blog – 感觉是个大神 但是好像不是最官方的 &#xff0c…...

Linux互斥量读写锁

一、互斥量 1.临界资源 同一时刻只允许一个进程/线程访问的共享资源&#xff08;比如文件、外设打印机&#xff09; 2.临界区 访问临界资源的代码 3.互斥机制 mutex互斥锁&#xff0c;用来避免临界资源的访问冲突&#xff0c;访问临界资源前申请互斥锁&#xff0c;访问完释放…...

网络安全之IP伪造

眼下非常多站点的涉及存在一些安全漏洞&#xff0c;黑客easy使用ip伪造、session劫持、xss攻击、session注入等手段危害站点安全。在纪录片《互联网之子》&#xff08;建议搞IT的都要看下&#xff09;中。亚伦斯沃茨&#xff08;真实人物&#xff0c;神一般的存在&#xff09;涉…...

ARM CCA机密计算安全模型之硬件强制安全

安全之安全(security)博客目录导读 [要求 R0004] Arm 强烈建议所有 CCA 实现都使用硬件强制的安全(CCA HES)。本文件其余部分假设系统启用了 CCA HES。 CCA HES 是一个可信子系统的租户——一个 CCA HES 主机(Host),见下图所示。它将以下监控安全域服务从应用处理元件(P…...

【论文笔记】A Token-level Contrastive Framework for Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: A Token-level Contrastiv…...

兰州新区建设厅网站/营销策略是什么

腾讯以山海经为题材的无缝开放世界手游《妄想山海》已于今日开启预约。《妄想山海》手游是2020年腾讯重磅推出的无缝开放世界手游&#xff0c;历经4年时间开发&#xff0c;力求打造超越想象的奇幻的山海经大荒世界。当前已进行过多轮万人规模测试&#xff0c;玩家好评如潮&…...

域名注册完成后如何做网站/湖南网络推广排名

python读写文件 通常我们是通过open函数来读写文件的。 以下是open函数的源码&#xff1a; def open(file, moder, bufferingNone, encodingNone, errorsNone, newlineNone, closefdTrue):我们通常只会用到前两个参数&#xff0c;其中file指的是文件名&#xff0c;而mode指的…...

域名停靠网站 2015/推广的软件

可以用Windows优化大师清理一下DLL文件&#xff0c;以及ActiveX。并在系统优化选项下选择开机速度优化&#xff0c;把启动信息停留时间设置为3秒或直接进入。最后再把一些不必要的字体卸载。桌面尽量少放东西否则explorer.exe加载会很慢。如果这些优化后你还觉得慢&#xff0c;…...

不会写程序如何做网站/企业网站推广方案策划

一、发现经过一段时间的观察&#xff0c;我发现通过引入第三维度&#xff0c;我可以把那些我理想中的那些细节加入到这些简单的图标中&#xff0c;而且看起来一点都不复杂、凌乱。在3D的插图中多出两个面&#xff0c;使它更接近现实中的物理对象的同时&#xff0c;还增加了视觉…...

怎样仿网站的css特效/精准的搜索引擎优化

昨天晚上去师姐家玩&#xff0c;海淀的一个很小的老房子&#xff0c;现在只住着一只狗叫花花。老旧门&#xff0c;打开吱呀作响。我早起去买早饭的时候&#xff0c;捣鼓了好半天才有了生锈了的弹簧锁特有的撞击声。在屋里到处看看&#xff0c;大概十几步的样子就足够看完所有细…...

邢台路桥建设总公司网站/刷赞业务推广网站

一、前言 1、[].slice.call(lis)将伪数组转化为真数组 2、node.nodeType: 得到节点类型 3、Object.defineProperty(obj, propName, {}): 给对象添加修改属性 4、Object.keys(obj) 5、DocumentFragment: 文档碎片…...