码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【C++】详解 eventpp 事件调度程序和回调列表库


    目录

    1、eventpp 事件调度程序和回调列表库

    2、特点

    3、程序示例

    使用回调列表

    事件调度器 

     使用事件队列


    1、eventpp 事件调度程序和回调列表库

    eventpp 是一个用于回调、事件调度程序和事件队列的C++事件库。使用 eventpp,您可以轻松实现信号和插槽机制、发布者和订阅者模式或观察者模式。

    wqking/eventpp:事件调度程序和C++回调列表 (github.com)icon-default.png?t=N7T8https://github.com/wqking/eventpp

    2、特点

    • 支持同步事件调度和异步事件队列。
    • 可通过策略和混合进行配置和扩展。
    • 支持通过混音进行事件过滤器。
    • 支持嵌套事件。在处理事件的过程中,侦听器可以安全地调度事件并附加/预置/插入/删除其他侦听器。
    • 线程安全。支持多线程。
    • 异常安全。大多数操作都保证了强大的异常安全性。
    • 经过良好测试。由单元测试提供支持。
    • 事件队列可以在 1 秒内处理 10M 个事件(每毫秒 10K 个事件)。
    • 回调列表可以在 1 秒内调用 100M 次回调(每毫秒 100K 次回调)。
    • 回调列表可以在 1 秒内添加/删除 5M 个回调(每毫秒 5K 个回调)。
    • 侦听器和事件可以是任何类型的,不需要从任何基类继承。
    • 可以简化使用的实用程序,例如自动断开连接、单次侦听器、参数类型适配器等。
    • 仅标头,无源文件,无需构建。不依赖于其他库。
    • 需要 C++ 11。
    • 用便携式和标准C++编写

    直接将源代码包含在项目中。

    Eventpp 是仅标头库。只需克隆源代码,然后将 eventpp 中的“include”文件夹添加到您的项目包含目录中,然后您就可以使用该库。您无需链接到任何源代码。

    3、程序示例

    使用回调列表

    1. #include
    2. #include "eventpp/callbacklist.h"
    3. using namespace std;
    4. int main()
    5. {
    6. eventpp::CallbackList<void (const string &, const bool)> callbackList;
    7. callbackList.append([](const string & s, const bool b) {
    8. cout << boolalpha << "s:" << s << "b:" << b << endl;
    9. });
    10. callbackList.append([](string s, int b) {
    11. std::cout << std::boolalpha << "Got callback 2, s is " << s << " b is " << b << std::endl;
    12. });
    13. callbackList("fan", true);
    14. return 0;
    15. }

    事件调度器 

    #include "eventpp/eventdispatcher.h"
    1. static void test() {
    2. cout << "test" << endl;
    3. }
    4. void CFan::test_2() {
    5. eventpp::EventDispatcher<int, void()> dispatcher;
    6. dispatcher.appendListener(3, []() {
    7. cout << "get 3" << endl;
    8. });
    9. dispatcher.appendListener(6, [](){
    10. cout << "get 6(1)" << endl;
    11. });
    12. dispatcher.appendListener(6, []() {
    13. cout << "get 6(2)" << endl;
    14. });
    15. dispatcher.appendListener(8, test);
    16. // dispatch
    17. dispatcher.dispatch(8);
    18. dispatcher.dispatch(3);
    19. dispatcher.dispatch(6);
    20. }

     使用事件队列

    #include "eventpp/eventqueue.h"
    1. static void task_1(const string & arg1, const string & arg2) {
    2. cout << arg1 << "+" << arg2 << endl;
    3. }
    4. static void task_2(const string &arg1, const string & arg2) {
    5. cout << arg1 << "+" << arg2 << endl;
    6. }
    7. void CFan::test_3() {
    8. eventpp::EventQueue<int, void (const string &, const string &)> queue;
    9. queue.appendListener(1, task_1);
    10. queue.appendListener(5, task_2);
    11. queue.enqueue(1, "Hello", "world!");
    12. queue.enqueue(5, "Fan", "1111");
    13. queue.process();
    14. }

  • 相关阅读:
    【查找重复代码】python实现-附ChatGPT解析
    好的摄影师都会iPhone 8和iOS 11的这三项功能
    Web版Photoshop来了,用到了哪些前端技术?
    每天一个前端小知识02——Vue响应原理
    大模型引领未来:探索其在多个领域的深度应用与无限可能【第五章、广告营销与文化娱乐:AI与大模型创造无限可能】
    VMware WorkStation 16的配置安装、CentOS 7的配置安装、使用Finalshell访问虚拟机(22.9.14)
    Java中的锁
    IPv6转换难点分析之一:国家监测指标-中科三方
    JVM垃圾回收算法
    界面控件DevExpress WinForms 2024产品路线图预览(一)
  • 原文地址:https://blog.csdn.net/fanjufei123456/article/details/128097861
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号