多任务响应1(Qt)

news2025/4/19 16:48:53

多任务响应1

  • 1. 架构概述
  • 2. 代码示例
  • 3. 说明

当系统的一些任务都是同一个对象产生,但需要交由不同对象进行响应。
比如:系统有多个按键,这些按键的共用一个槽函数,但不同的按键对应不同的功能响应。

推荐采用命令模式+分散响应的思想。在这种设计中,

  • 每个按键对应一个实现了统一接口(如 ICommand)的命令对象,

  • 每个命令负责单一的功能,符合单一职责原则;

  • 一个中心的 CommandManager 用于注册和管理命令,根据传入的命令标识执行对应操作;

  • 按键的 clicked 信号通过 lambda 表达式与 CommandManager 的执行接口绑定,从而实现分散响应。

下面分为三个部分介绍:

1. 架构概述

设计思想:

  • 解耦与扩展性: 每个功能都有独立的命令对象,新增或修改按键响应只需要新增或修改对应命令,而不必改动整体分发逻辑;

  • 统一管理: CommandManager 统一管理各个命令对象,与 UI 层解耦。利用 Qt 的信号和槽,UI 层只需负责转发按键事件;

  • 灵活性: 利用 C++17 的特性(如 lambda 表达式、std::unique_ptr 等),使代码更加现代化和健壮。

架构示意图:

[UI按钮]
    │ clicked()
    ▼
[Lambda表达式]
    │ 调用
    ▼
[CommandManager] ---- 查找命令 ----> [ICommand] ---> 执行具体功能

2. 代码示例

以下是一个完整的示例代码,包括命令接口、具体命令实现、命令管理器以及如何在 Qt 的主窗口中连接按钮信号。

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>
#include <QString>
#include <unordered_map>
#include <memory>

// 1. 定义命令接口
class ICommand {
public:
    virtual ~ICommand() = default;
    virtual void execute() = 0;
};

// 2. 具体命令实现(示例:启动和停止操作)
class SpindleStartCommand : public ICommand {
public:
    void execute() override {
        qDebug() << "Spindle started.";
        // 此处添加数控软件启动主轴等操作的具体实现
    }
};

class SpindleStopCommand : public ICommand {
public:
    void execute() override {
        qDebug() << "Spindle stopped.";
        // 此处添加数控软件停止主轴等操作的具体实现
    }
};

// 3. 命令管理器,用于注册和执行命令
class CommandManager {
public:
    using CommandPtr = std::unique_ptr<ICommand>;

    // 注册命令,commandName 作为标识
    void registerCommand(const QString &commandName, CommandPtr command) {
        commands_[commandName] = std::move(command);
    }

    // 根据命令名称执行对应命令
    void executeCommand(const QString &commandName) {
        auto it = commands_.find(commandName);
        if (it != commands_.end()) {
            it->second->execute();
        } else {
            qWarning() << "Command not found:" << commandName;
        }
    }

private:
    std::unordered_map<QString, CommandPtr> commands_;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    // 主窗口及布局
    QWidget window;
    window.setWindowTitle("数控软件示例");
    QVBoxLayout *layout = new QVBoxLayout(&window);

    // 创建两个示例按钮
    QPushButton *btnStart = new QPushButton("启动主轴");
    QPushButton *btnStop  = new QPushButton("停止主轴");

    layout->addWidget(btnStart);
    layout->addWidget(btnStop);

    // 4. 初始化命令管理器并注册具体命令
    CommandManager commandManager;
    commandManager.registerCommand("start", std::make_unique<SpindleStartCommand>());
    commandManager.registerCommand("stop", std::make_unique<SpindleStopCommand>());

    // 5. 连接按钮信号到命令执行,通过 lambda 调用 CommandManager 对应方法
    QObject::connect(btnStart, &QPushButton::clicked, [&commandManager]() {
        commandManager.executeCommand("start");
    });
    QObject::connect(btnStop, &QPushButton::clicked, [&commandManager]() {
        commandManager.executeCommand("stop");
    });

    window.show();
    return app.exec();
}

3. 说明

  • 模块化设计:
    每个具体命令(例如 SpindleStartCommand、SpindleStopCommand)只负责它自己的功能,后续添加新功能时,只需新建命令类并在 CommandManager 中注册,不用修改原有代码。

  • 使用 Qt 信号槽机制:
    利用 lambda 表达式直接在连接中调用 CommandManager 的 executeCommand 方法,使得连接逻辑非常直观,不需要中间的 QSignalMapper。

  • 扩展性:
    如果今后需要新增其他控制功能,只需要实现继承 ICommand 的新命令类,然后在界面中添加对应按钮或其他触发器,通过 CommandManager 注册并连接对应命令即可。

  • C++17特性:
    示例中使用了 std::unique_ptr 来管理命令对象以及 lambda 表达式,使得代码更加现代化,同时降低资源管理的复杂度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337418.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MGR实现mysql高可用性

一。MGR和PXC的区别 1. PXC的消息广播机制是在节点间循环的&#xff0c;需要所有节点都确认消息&#xff0c;因此只要有一个节点故障&#xff0c;则会导致整个PXC都发生故障。而MGR则是多数派投票模式&#xff0c;个别少数派节点故障时&#xff0c;一般不影响整体的可用性。这…

新型多机器人协作运输系统,轻松应对复杂路面

受到鱼类、鸟类和蚂蚁等微小生物体协作操纵的启发&#xff0c;研究人员开发了多机器人协作运输系统&#xff08;Multirobot Cooperative Transportation Systems&#xff0c;MRCTS&#xff09;运输单个机器人无法处理的重型超大物体&#xff0c;可用于搜救行动、灾难响应、军事…

【秣厉科技】LabVIEW工具包——OpenCV 教程(19):拾遗 - imgproc 基础操作(上)

文章目录 前言imgproc 基础操作&#xff08;上&#xff09;1. 颜色空间2. 直方图3. 二值化4. 腐蚀、膨胀、开闭运算5. 梯度与轮廓6. 简易绘图7. 重映射 总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Windows系统&#x…

学习笔记:金融经济学 第3讲

学习笔记&#xff1a;金融经济学 第3讲 注&#xff1a;A本金&#xff0c;n时间&#xff08;比如年&#xff09;&#xff0c;r利率一、 计算习惯1. 单息&#xff08;新产生的利息不算进本金重新计算利息&#xff0c;收款额A(1nr) &#xff09;2. 复利(新产生的利息算进本金重新计…

NVIDIA RTX™ GPU 低成本启动零售 AI 场景开发

零售行业正在探索应用 AI 升级客户体验&#xff0c;同时优化内部流程。面对多重应用场景以及成本优化压力&#xff0c;团队可采用成本相对可控的方案&#xff0c;来应对多重场景的前期项目预演和落地&#xff0c;避免短期内大规模投入造成的资源浪费。 客户体验 AI 场景的研究…

【网络】IP层的重要知识

目录 1.IP层的作用 2.主机和节点 3.网络层和数据链路层的关系 4.路由控制 4.1.路由控制的过程 4.2. IP地址与路由控制 4.3.路由控制表的聚合 4.4.静态路由和动态路由 4.5.动态路由的基础 5.数据链路的抽象化 5.1.数据链路不同&#xff0c;MTU则相异 5.2.路径MTU发…

OpenCV 模板匹配方法详解

文章目录 1. 什么是模板匹配&#xff1f;2. 模板匹配的原理2.1数学表达 3. OpenCV 实现模板匹配3.1基本步骤 4. 模板匹配的局限性5. 总结 1. 什么是模板匹配&#xff1f; 模板匹配&#xff08;Template Matching&#xff09;是计算机视觉中的一种基础技术&#xff0c;用于在目…

一键解锁Landsat 9地表温度计算!ENVI与ArcGIS Pro全流程详解(无需NASA大气校正)

为什么选择Landsat 9的L2SP数据&#xff1f; 之前&#xff1a;《ArcGIS与ENVI——基于landsat与Modis影像的遥感技术的生态环境质量评价》&#xff0c;基于Landsat前期的产品计算温度反演数据需要一系列复杂的步骤。 现在&#xff1a; Landsat 8-9的Collection 2 Level-2&…

RK3588的linux下实现HDMI输出分辨率及帧率的裁剪

bug反馈&#xff1a;客户现场反馈hdmi接显示屏出现概率性闪黑屏&#xff0c;排除线材&#xff0c;显示屏及GND等外部因素后&#xff0c;提出尝试降低hdmi的输出分辨率和帧率对比测试看看。 Step1&#xff1a;先直接在linux的sdk中找到板卡编译生成后的dts找到hdmi节点 然后找到…

XR技术赋能艺术展演|我的宇宙推动东方美学体验化

本次广州展览现场引入我的宇宙XR体验模块&#xff0c;通过空间计算与动作捕捉技术&#xff0c;让观众在潮玩艺术氛围中体验虚拟互动&#xff0c;打造“看得懂也玩得动”的展演新场景。 作为科技与文化融合的推动者&#xff0c;我的宇宙正在以“体验科技”为媒介&#xff0c;为潮…

多线程进阶知识篇(二)

文章目录 一、Synchronized 锁二、ReentrantLock 锁三、两阶段终止阶段一&#xff1a;通知终止阶段二&#xff1a;响应中断 四、线程池为什么要使用线程池&#xff1f;如何创建线程池&#xff1f;ExecutorsThreadPoolExecutor 线程池的基本参数 五、线程池处理任务的流程 一、S…

Python深度学习基础——深度神经网络(DNN)(PyTorch)

张量 数组与张量 PyTorch 作为当前首屈一指的深度学习库&#xff0c;其将 NumPy 数组的语法尽数吸收&#xff0c;作为自己处理张量的基本语法&#xff0c;且运算速度从使用 CPU 的数组进步到使用 GPU 的张量。 NumPy 和 PyTorch 的基础语法几乎一致&#xff0c;具体表现为&am…

简单实现单点登录

单点登录 单点登录&#xff08;Single Sign-On, SSO&#xff09; SSO是一种统一身份认证技术&#xff0c;用户只需在认证平台登录一次&#xff0c;即可访问所有关联的应用程序或网站&#xff0c;无需重复输入凭据。例如&#xff0c;企业员工登录内部系统后&#xff0c;可直接…

02、GPIO外设(一):基础知识

基础知识 1、ZET6的引脚分布2、引脚输出3、引脚输入4、最大输出速度 1、ZET6的引脚分布 下面使用C8T6的引脚来类比ZET6的引脚&#xff0c;ZET6中的特殊功能引脚和C8T6的特殊功能引脚是一样。而通用IO引脚比C8T6多而已。下面的C8T6的特殊功能引脚的介绍&#xff1a; STM32F103C8…

智能Todo协作系统开发日志(二):架构优化与安全增强

&#x1f4c5; 2025年4月14日 | 作者&#xff1a;Aphelios380 &#x1f31f; 今日优化目标 在原Todo单机版基础上进行三大核心升级&#xff1a; 组件化架构改造 - 提升代码可维护性 本地数据加密存储 - 增强隐私安全性 无障碍访问支持 - 践行W3C标准 一、组件化架构改造 …

【C++初阶】第14课—缝合怪deque和优先队列、仿函数

文章目录 1. 双端队列deque1.1 认识deque1.2 deque的迭代器1.3 deque的常用接口1.4 deque的优缺点 2. 优先队列priority_queue2.1 认识priority_queue2.2 模拟实现优先队列priority_queue 3. 仿函数 在学习deque之前&#xff0c;回顾一下vector和list各自的优缺点 数据结构优点…

方德桌面操作系统V5.0-G23安装Docker并配置DockerHub镜像加速器

为什么要使用debina的docker源&#xff0c;因为查询os-release和uname 显示是基于debina 11的操作系统 rootyuhua-virtualmachine:~# cat /etc/os-release NAME"方德桌面操作系统" NAME_EN"NFSDesktop" VERSION"5.0" VERSION_ID"5.0"…

紫光同创FPGA实现HSSTLP光口视频点对点传输,基于Aurora 8b/10b编解码架构,提供6套PDS工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目紫光同创FPGA相关方案推荐我这里已有的 GT 高速接口解决方案Xilinx系列FPGA实现GTP光口视频传输方案推荐Xilinx系列FPGA实现GTX光口视频传输方案推荐Xilinx系列FPGA实…

数字孪生城市技术应用典型实践案例汇编(22个典型案例)(附下载)

近年来&#xff0c;数字孪生技术在我国从战略框架逐步向系统性落地推进&#xff0c;成为推动数字中国建设的重要技术引擎。随着《数字中国建设整体布局规划》《"十四五"数字经济发展规划》《深化智慧城市发展推进城市全域数字化转型的指导意见》等政策的实施&#xf…

Hyperf (Swoole)的多进程 + 单线程协程、Gin (Go)Go的单进程 + 多 goroutine 解说

1. 核心概念解析 (1) Hyperf (Swoole): 多进程 单线程协程 Swoole 并发模型详解 Swoole 的并发模型基于多进程架构&#xff0c;每个进程是单线程的&#xff0c;线程内运行多个协程。以下是其结构的关键点&#xff1a; 多进程&#xff1a;Swoole 应用程序启动时&#xff0c;…