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

西安高端网站建设哪家好百度推广免费

西安高端网站建设哪家好,百度推广免费,国外网站服务器,企业局域网游戏网站如何做限制C笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec() code review! 参考笔记 1.qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面 2.qt-C笔记之QThread使用 3.qt-C笔记之多线程架构模式:事件信号监…

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() 提前退出,使事件循环持续运行并监听事件。

http://www.mmbaike.com/news/102005.html

相关文章:

  • 西安做网站费用seo快速排名优化
  • 公司网站开发维护搜狗推广登陆
  • 备案 网站负责人 法人加速游戏流畅的软件
  • 吴中seo网站优化软件seo系统优化
  • 无锡设计师网站百度关键词规划师入口
  • 如何在别人网站挂黑链重庆专业seo
  • 郑州做网站助企注册网站怎么注册
  • 五金加工厂怎么做网站宁夏百度公司
  • 精品课程网站怎么做最近新闻热点国家大事
  • 做网站推广的价格手机优化助手下载
  • php网站设计活动软文模板
  • 中国代加工网站黄冈网站推广厂家
  • 广告公司管理软件北京网站营销seo方案
  • 响应式网站建设市场石家庄网络推广优化
  • 用dw制作购物网站首页网站关键词在哪里看
  • 网站怎么做子页企业网站制作方案
  • 昆明做网站建设公司手机如何制作一个网页链接
  • 做网站现在什么尺寸合适seo服务商技术好的公司
  • 顺义做网站公司google推广工具
  • 网站建设合同封面谷歌seo快速排名优化方法
  • 运维网站制作百度推广步骤
  • 网站建设的主要职责谷歌浏览器网址
  • 深圳企业网站怎么做免费b站推广短视频
  • 成都 网站建设培训学校aso安卓优化
  • 建企业网站浩森宇特新闻类软文营销案例
  • 中国著名的个人网站长沙网站seo排名
  • 西宁网站建设高端百度推广页面投放
  • 50强网站开发语言下载微信
  • 天津做优化的网站有多少家关键字搜索
  • 增城百度做网站多少钱职业技能培训中心