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

浅谈C++之触发器用法

一、基本用法

        在C++中,触发器(Trigger)的概念通常指的是在特定条件下自动执行某些操作的机制。这可以是通过事件驱动编程、回调函数、信号和槽机制(如Qt框架中使用)等方式实现的。

二、简单应用

1. 使用函数指针和回调函数

这是实现触发器的一种简单方式,通过将函数作为参数传递给另一个函数,当特定条件满足时,调用这个函数。

#include <iostream>
#include <functional>

// 定义一个函数,它接受一个回调函数作为参数
void trigger(std::function<void()> callback) {
    // 特定条件满足时,调用回调函数
    callback();
}

int main() {
    // 定义一个回调函数
    std::function<void()> myCallback = []() {
        std::cout << "Triggered!" << std::endl;
    };

    // 调用trigger函数,并传递回调函数
    trigger(myCallback);

    return 0;
}

2. 使用信号和槽(Qt框架)

在Qt框架中,信号和槽是一种非常强大的触发器机制,用于对象之间的通信。

#include <QObject>
#include <QDebug>

class Sender : public QObject {
    Q_OBJECT

public:
    void doSomething() {
        qDebug() << "Sender::doSomething()";
        emit mySignal();
    }

signals:
    void mySignal();
};

class Receiver : public QObject {
    Q_OBJECT

public slots:
    void doSomething() {
        qDebug() << "Receiver::doSomething()";
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    Sender sender;
    Receiver receiver;

    // 连接信号和槽
    QObject::connect(&sender, &Sender::mySignal, &receiver, &Receiver::doSomething);

    sender.doSomething();

    return a.exec();
}

#include "main.moc"

3. 使用事件驱动编程

在事件驱动编程中,程序的执行流程由事件(如用户输入、定时器事件等)驱动。

#include <iostream>
#include <thread>
#include <chrono>

void timerTrigger() {
    std::cout << "Timer triggered!" << std::endl;
}

int main() {
    // 设置一个定时器,5秒后触发
    std::thread timerThread([&]() {
        std::this_thread::sleep_for(std::chrono::seconds(5));
        timerTrigger();
    });

    timerThread.join();

    return 0;
}

4. 使用C++20的协程

C++20引入了协程,可以用于实现更复杂的异步操作和触发器。

#include <iostream>
#include <coroutine>
#include <thread>

struct Task {
    struct promise_type {
        Task get_return_object() { return {}; }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        void return_void() {}
        void unhandled_exception() {}
    };
};

Task triggerAfter(std::chrono::seconds delay) {
    std::this_thread::sleep_for(delay);
    std::cout << "Triggered after " << delay.count() << " seconds." << std::endl;
}

int main() {
    std::coroutine_handle<> h = std::coroutine_handle<promise_type<Task>>::from_promise(promise_type<Task>{});
    h.resume();
    h.destroy();

    return 0;
}


http://www.kler.cn/news/362858.html

相关文章:

  • 快速搭建SpringBoot3+Prometheus+Grafana
  • Java 使用 itextpdf 自定义 生成 pdf
  • 2024 睿抗机器人开发者大赛(RAICOM)-【网络安全】CTF 部分WP
  • LabVIEW提高开发效率技巧----插入式架构
  • pdf编辑软件有哪些?方便好用的pdf编辑软件分享
  • JMeter使用不同方式传递接口参数
  • 云原生后端:构建现代化、高扩展性的应用基础设施
  • Docker入门之安装
  • wmware下centos9磁盘扩容/原分区扩容
  • STM32通信协议-I2C
  • RISC-V笔记——Pipeline依赖
  • kali的下载与配置
  • css 切角实现(全)
  • ffmpeg的视频滤镜: 抠图-chromakey
  • MongoDB 安装教程(MAC版本)
  • react 基础学习笔记
  • 数据降维与主成分分析
  • Python项目内网环境pdm install超时httpx.ReadTimeout: timed out
  • VMware虚拟机中centos磁盘扩容(非VG分区挂载方案)
  • RabbitMQ 中的交换机学习
  • 项目实战-图书管理系统之个人中心
  • 【02】RabbitMQ客户端应用开发实战
  • gin入门教程(7): 使用 Logrus + Lumberjack 创建日志中间件
  • 【RabbitMQ】如何在 Ubuntu 安装 RabbitMQ
  • react1816中的setState同步还是异步的深层分析
  • 【p2p、分布式,区块链笔记 Blockchain】truffle002 unleashed_rentable_nft 项目