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

QT 事件驱动架构

很多大型系统工业软件、机器人系统、自动驾驶、复杂 Qt 应用在规模变大以后都会逐渐引入事件驱动架构Event Bus / Event Driven Architecture。原因很简单当系统模块越来越多时模块之间的调用关系会爆炸式增长最终变得无法维护。我用一个逐步演化的真实思维过程来解释。一、最初阶段直接调用最直观系统刚开始只有几个模块UIMotorControllerCameraController调用关系很简单UI → MotorController UI → CameraController代码类似voidMainWindow::onStartClicked(){motorController.start();cameraController.capture();}问题不大。二、系统变大调用关系开始爆炸后来系统增加很多模块MotorControllerCameraControllerLightControllerNetworkControllerDataLoggerAlarmSystemUI此时如果还是直接调用会变成UI → MotorController UI → CameraController UI → LightController MotorController → Logger MotorController → Alarm CameraController → Logger CameraController → Network Network → Controller模块之间的关系变成一个蜘蛛网结构A → B A → C B → D C → D D → E E → B这叫强耦合系统问题1️⃣ 修改一个模块可能影响很多模块2️⃣ 新增功能需要改很多代码3️⃣ 很难理解系统结构三、真实案例增加一个“报警系统”假设系统需要增加一个新模块AlarmSystem需求电机过载报警温度过高报警网络断开报警如果是直接调用MotorController 要加if(overload)alarm.raise(motor overload);CameraControllerif(cameraError)alarm.raise(camera error);NetworkControllerif(disconnect)alarm.raise(network error);问题❌ 每个模块都要修改❌ 未来新增模块还要继续改这就是耦合地狱。四、工程师的思考能不能让模块不互相认识工程师开始思考如果模块之间不直接调用而是发布消息会不会更好于是出现事件驱动架构五、事件驱动架构的核心思想模块之间不直接调用。而是发布事件和订阅事件通过一个EventBus事件总线连接。结构变成Module A → EventBus → Module B模块之间互相不知道对方存在。六、例子电机完成运动传统调用MotorController → CameraController代码motorController.moveDone();cameraController.capture();问题MotorController 必须知道 CameraController。事件驱动MotorController → EventBus CameraController ← EventBus代码发布事件eventBus.publish(MotorMoveDone);订阅事件eventBus.subscribe(MotorMoveDone,[](){camera.capture();});MotorController 不知道 CameraController。七、增加新功能时的变化假设我们新增Logger记录电机完成事件。传统方式需要修改MotorController CameraController事件方式只需要Logger 订阅事件代码eventBus.subscribe(MotorMoveDone,[](){logger.log(motor finished);});原代码完全不需要改。八、再举一个真实设备流程自动检测设备流程移动平台 → 拍照 → 图像检测 → 上传结果传统调用MotionController ↓ CameraController ↓ InspectionController ↓ NetworkController代码motion.move();camera.capture();autoresultinspect.detect();network.send(result);模块互相依赖。事件驱动MotionController ↓ Event: MoveDone CameraController ↓ Event: ImageCaptured InspectionController ↓ Event: InspectionDone结构MotionController ↓ EventBus ↓ CameraController ↓ EventBus ↓ InspectionController九、系统结构变化没有 EventBusA → B → C → D有 EventBusA → EventBus B → EventBus C → EventBus D → EventBus模块只依赖EventBus系统耦合大幅下降。十、再举一个复杂例子工业软件事件TemperatureHigh订阅者可能有AlarmSystem Logger UI CoolingController发布者SensorController代码发布eventBus.publish(TemperatureHigh);订阅eventBus.subscribe(TemperatureHigh,[](){alarm.trigger();});eventBus.subscribe(TemperatureHigh,[](){logger.log();});eventBus.subscribe(TemperatureHigh,[](){ui.showWarning();});新增功能只需要新增订阅者十一、事件驱动带来的巨大好处1 模块解耦模块互相不认识。2 可扩展新增功能新增订阅者不用修改旧代码。3 更符合现实世界现实世界就是事件驱动门打开 → 灯亮 门打开 → 摄像头启动 门打开 → 报警系统记录4 易于并发事件可以异步处理 多线程处理十二、Qt 为什么非常适合事件架构Qt 本身就是事件驱动框架。例如Signal → Slot本质就是Event → Listener例子connect(button,QPushButton::clicked,this,MainWindow::onClicked);这其实就是一个小型 EventBus。十三、大型系统为什么几乎都用事件架构因为系统规模一大就会出现模块数量 ↑ 调用关系 ↑↑ 复杂度 ↑↑↑EventBus可以把N² 的调用关系变成N 的关系这是复杂度降低的关键。十四、一句话理解 EventBus普通架构模块直接打电话事件架构模块在广播电台发布消息 需要的人自己收听

相关文章:

QT 事件驱动架构

很多大型系统(工业软件、机器人系统、自动驾驶、复杂 Qt 应用)在规模变大以后,都会逐渐引入 事件驱动架构(Event Bus / Event Driven Architecture)。 原因很简单:当系统模块越来越多时,模块之间…...

大数据领域数据预处理的重要性及实施策略

大数据领域数据预处理的重要性及实施策略 关键词:大数据、数据预处理、数据清洗、数据集成、数据转换、数据归约、实施策略 摘要:本文深入探讨大数据领域中数据预处理的重要性,通过形象的比喻和实际案例,阐述数据清洗、集成、转换、归约等核心概念及其相互关系。同时,借助…...

物理常识,原来世界是这样的。

宇宙 & 相对论类1. 任何有质量的物体都不可能达到光速,只能无限接近。 2. 速度越快,时间越慢。你跑起来的时候,时间真的比站着的人过得慢一点点。 3. 引力本质不是“拉力”,而是质量把时空压弯了,物体只是沿着弯曲…...

TR-069/TR-369 项目框架实施总结

TR-069/TR-369 项目框架实施总结 📋 实施概览 已成功搭建 TR-069 CWMP 和 TR-369 USP 协议的项目框架,完成 P0 优先级的核心类实现。 ✅ 已完成工作 1. 项目结构搭建 1.1 模块划分 ✅ yudao-module-iot-tr069 - TR-069 CWMP 协议模块 ✅ yudao-module-iot-tr369 - TR-3…...

基于Python的教学辅助系统设计与实现毕业设计源码

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一款基于Python的教学辅助系统,旨在提高教学效率、优化教学过程、丰富教学手段,并为学生提供个性化学习体验。具体研…...

【2.19】Gardner环硬件片内测试2——硬件测试和分析

目录 1.学习回顾 2.综合布局布线 3.产生bit文件 4.程序烧写 5.在线波形查看和调试 6.程序硬件调试操作视频 本文介绍了FPGA开发板硬件调试的全流程: 1)回顾前期准备工作; 2)详细讲解综合布局布线步骤及其重要性; 3)说明bit文件的生成与作用; 4)演示程序…...

库存管理,把这4件事做好就够了

目录 第一件事:搞清楚你到底有什么 第二件事:想清楚什么时候买,买多少 第三件事:把东西放在该放的地方 第四件事:定期清理不动销的货 写在最后 之前和一些做企业的朋友聊天,很多人提到库存管理&#x…...

ADS2016如何找到SmithChartMatch

关于我找这个器件找了两周也没找到这件事……终于被我捣鼓出来了。软件:ADS2016前情:我的元件库里无论如何都找不到第一步:Tools→SmithChart第二步:选择Palette第三步:在左边面板里弹出的元件中就可以看到我们需要的S…...

xStocks.fi:DeFi 领域的代币化股票与 ETF 创新

## 前言随着去中心化金融(DeFi)的不断演进,传统金融资产与区块链技术的融合成为新的焦点。xStocks.fi 正是这一趋势的杰出代表,它将全球最受欢迎的美国股票和交易所交易基金(ETF)代币化,引入链上…...

代码筑梦者:数字世界的隐秘建筑师

代码筑梦者:程序员的隐秘世界在数字时代的星河里,有这样一群人——他们的指尖在键盘上飞舞,用0和1编织着世界的另一重维度。程序员,这群现代社会的代码筑梦者,他们的工作早已超越了简单的“写代码”,而是成…...

量化交易系列(八):OKX 搞了个 AI Trade Agent,是普通人的机会还是手续费收割机?

量化交易系列(八):OKX 搞了个 AI Trade Agent,是普通人的机会还是手续费收割机? 导语 2026 年 3 月,OKX 官宣推出 Agent Trade Kit——一款基于 MCP 协议的开源 AI 交易工具集,提供 83 个工具,覆盖行情发现、策略执行、期权交易、算法委托、Bot 策略管理全链路,还内…...

PAT 乙级 1034

本题最关键就是要思路清晰的写函数,函数只是处理,分子和分母,把 分子/分母 写回正确的模式。还有要注意,所有的整数定义都要写 long long,scanf 要写 %lld,在最开始定义 a b 的时候也要这么写,因…...

Win10 -> Win11 升级机制 导致应用不可用

一、问题 我今天刚升级了系统(从win10到win11)现在的问题是:我在vscode,kiro等软件想使用anconda环境,使用conda init命令显示: Unable to create process using H:\myMinAnconda\python.exe H:\myMinAnco…...

Dubbo 核心知识点速记

一、工程结构:为什么要拆三个模块整个项目拆成三个 Maven 子模块,由一个父 POM 聚合管理:dubbo-demo(父工程,packagingpom) ├── dubbo-api → 接口契约层 ├── dubbo-provider → 服务提供者…...

第三篇:从零搭建 Spring Boot 3 + Dubbo 3 + ZooKeeper 微服务实战 -- 消费者 模块

创建 dubbo-consumer 模块&#xff08;服务消费者&#xff09;Consumer 通过 ZooKeeper 发现 Provider&#xff0c;发起 RPC 调用&#xff0c;并通过 REST 接口将结果暴露给前端或外部系统。5.1 pom.xml&#xff0c;与 Provider 模块的依赖基本一致。dubbo-consumer/pom.xml<…...

物联网面试必过要点

要是能熟记以下知识点&#xff0c;再加上自身的项目经验&#xff0c;过个面试&#xff0c;问题不大。指针定义一个指向指针的的指针&#xff0c;它指向的指针是指向一个整型数 int **a; 一个有10个指针的数组&#xff0c;该指针是指向一个整型数的 int *a[10]; 一个指向有10个整…...

完整博文目录

Java 集合 JDK 常用集合类源码阅读 &#x1f31f; 并发 JUC 并发包源码阅读 &#x1f31f;ThreadPoolExecutor 与常用线程池volatile, synchronized 和锁 基础扩展 String 字符串浅析反射机制异常机制 数据库 HBase HBase原理 &#x1f31f; MySQL 事务&#xff0c;隔离…...

第一篇:从零搭建 Spring Boot 3 + Dubbo 3 + ZooKeeper 微服务实战

技术栈速览组件版本说明Spring Boot3.2.6基础框架Apache Dubbo3.3.4RPC 框架ZooKeeper3.9.2注册中心&#xff08;Docker 部署&#xff09;Curator5.xZK 客户端&#xff08;由 Starter 管理&#xff09;JDK17Spring Boot 3 最低要求项目目录结构先把整体结构了然于胸&#xff0c…...

联合循环——14 厂用电缆介绍

一、电缆的应用类别 电缆&#xff0c;是连接两个设备传输电信号的组件&#xff0c;由两条或更多的导线粘合、扭曲或编织在一起形成。电缆的用途广泛并且每个用途都需特制&#xff0c;它的功能大至传输电能、电信号和实现电磁能转换的线材产品。 电力缆通常由传输电力或电信号的…...

文章代码地址

文章目录 CSDN主页 文章代码 文章目录 工具 docsify详解 Git详解 nssm详解 Typora详解 VScode入门 PhotoShop入门 PM2详解 json-server详解 VMware Workstation Pro详解 计算机基础 Linux详解 网络详解 HTTP详解 计算机常用端口 语义化版本规范&#xff08;SemVer&#…...

联合循环——13 智能电厂的发展

一、国内外智能电厂 1.1 大唐姜堰智慧电厂的创新科技 原文链接&#xff1a;https://www.sohu.com/a/129754422_131990 &#xff08;1&#xff09;智慧决策系统&#xff1a; 智慧决策系统以关注数据的诊断、分析为己任&#xff0c;集科学、有效、便捷的数据诊断、分析方法与一身…...

联合循环——12 电厂通讯系统简介

一、SCADA &#xff08;Supervisory Control And Data Acquisition&#xff09; 数据采集与监视控制系统是以计算机为基础的DCS与电力自动化监控系统&#xff1b;它应用领域很广&#xff0c;可以应用于电力、冶金、石油、化工、燃气、铁路等领域的数据采集与监视控制以及过程控…...

联合循环——11 厂用储能电池原理介绍

一、化学能到电能 燃烧&#xff08;氧化还原反应&#xff09;是使化学能转换为电能的关键。而氧化还原反应的本质是氧化剂和还原剂之间发生电子转移的过程。电子转移引起化学键的重新组合。同时伴随着体系能量的变化。 如&#xff1a;煤的燃烧、铝和盐酸反应放热&#xff08;氧…...

Java毕业设计——基于 Java+SSM+微信小程序的智能二维码门禁管理系统设计与实现(毕业论文+程序源码)——门禁管理系统

基于 JavaSSM微信小程序的智能二维码门禁管理系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于 JavaSSM微信小程序的智能二维码门禁管理系统设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题…...

java毕业设计——基于 java+springboot+微信小程序的短视频社交平台设计与实现(毕业论文+程序源码)——短视频社交平台

基于 javaspringboot微信小程序的短视频社交平台设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于 javaspringboot微信小程序的短视频社交平台设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报…...

跨平台兼容性测试:Cypress在电商系统中的应用

一、电商系统中的兼容性测试挑战在数字化时代&#xff0c;电商系统需在多样化的设备&#xff08;如桌面、平板、手机&#xff09;和浏览器&#xff08;如Chrome、Firefox、Edge&#xff09;上无缝运行&#xff0c;以保障用户购物体验。跨平台兼容性测试验证软件在不同环境下的行…...

C++毕业设计——基于 C+++TCP+Websocket的即时通信系统设计与实现(毕业论文+程序源码)——即时通信系统

基于 CTCPWebsocket的即时通信系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于 CTCPWebsocket的即时通信系统设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板…...

Lumibot核心功能揭秘:股票、期权、期货一站式交易解决方案

Lumibot核心功能揭秘&#xff1a;股票、期权、期货一站式交易解决方案 【免费下载链接】lumibot Backtesting and Trading Bots Made Easy for Crypto, Stocks, Options, Futures, FOREX and more 项目地址: https://gitcode.com/gh_mirrors/lu/lumibot Lumibot是一款功…...

如何快速上手 runtimejs:轻量级 JavaScript 库操作系统完整指南

如何快速上手 runtimejs&#xff1a;轻量级 JavaScript 库操作系统完整指南 【免费下载链接】runtime [not maintained] Lightweight JavaScript library operating system for the cloud 项目地址: https://gitcode.com/gh_mirrors/runt/runtime runtimejs 是一个轻量级…...

如何使用img2css:将任何图片转换为纯CSS的终极指南

如何使用img2css&#xff1a;将任何图片转换为纯CSS的终极指南 【免费下载链接】img2css Convert any image to pure CSS. Recreates images using only box-shadows. 项目地址: https://gitcode.com/gh_mirrors/im/img2css img2css是一个创新工具&#xff0c;能够将任何…...