C++ 仿QT信号槽二
// 实现原理
// 每个signal映射到bitset位,全集
// 每个slot做为signal的bitset子集
// signal全集触发,标志位有效
// flip将触发事件队列前置
// slot检测智能指针全集触发的标志位,主动运行子集绑定的函数
// 下一帧对bitset全集进行触发清空,防止slot一直检测到signal触发
#include <any>
#include <iostream>#include "blinker.h"void testMatch() {blinker::SignalTrie<1024> trie;trie.Put("ab.cd.ef", 1);trie.Put("ab.cd.kk", 2);trie.Put("ab.xy.zz", 3);trie.Put("tt.xx", 4);trie.Put("ab.cd", 5);auto m1 = trie.Match("ab.cd.ef");//REQUIRE(m1.count() == 1);//REQUIRE(m1[1]);auto m2 = trie.Match("ab.cd.kk");//REQUIRE(m2.count() == 1);//REQUIRE(m2[2]);auto m3 = trie.Match("ab.xy.zz");//REQUIRE(m3.count() == 1);//REQUIRE(m3[3]);auto m4 = trie.Match("ab.not.found");//REQUIRE(m4.count() == 0);auto m5 = trie.Match("ab.*");//REQUIRE(m5.count() == 4);//REQUIRE(m5[1]);//REQUIRE(m5[2]);//REQUIRE(m5[3]);//REQUIRE(m5[5]);auto m6 = trie.Match("*");//REQUIRE(m6.count() == 5);//REQUIRE(m6[1]);//REQUIRE(m6[2]);//REQUIRE(m6[3]);//REQUIRE(m6[4]);//REQUIRE(m6[5]);auto m7 = trie.Match("ab.cd.*");//REQUIRE(m7.count() == 2);//REQUIRE(m7[1]);//REQUIRE(m7[2]);auto m8 = trie.Match("tt.xx.");//REQUIRE(m8.count() == 0);auto m9 = trie.Match("tt.xx.*");//REQUIRE(m9.count() == 0);auto m10 = trie.Match("ab.cd");//REQUIRE(m10.count() == 1);//REQUIRE(m10[5]);
}void testValue() {struct Data {int value = 1;Data(int value) : value(value) {}};blinker::Board board;auto signal1 = board.NewSignal("ab.cd");auto signal2 = board.NewSignal("ab.ef");auto signal3 = board.NewSignal("xy.zk");auto conn1 = board.Connect("ab.*");auto conn2 = board.Connect("ab.cd");auto conn3 = board.Connect("ab.ef");auto conn4 = board.Connect("xy.zk");auto conn5 = board.Connect("*");bool conn1CallbackCalled = false;bool conn2CallbackCalled = false;bool conn3CallbackCalled = false;bool conn4CallbackCalled = false;bool conn5CallbackCalled = false;auto tick = [&]() {signal1->Emit(std::make_shared<Data>(1));signal2->Emit(std::make_shared<Data>(2));signal3->Emit(std::make_shared<Data>(3));// signal1 and signal2conn1->Poll([&](const blinker::SignalId id, std::any data) {conn1CallbackCalled = true;auto p = std::any_cast<std::shared_ptr<Data>>(data);if (id == signal1->Id())std::cout << "value: " << p->value << std::endl;else if (id == signal2->Id())std::cout << "value: " << p->value << std::endl;elsestd::cout << "value error!" << std::endl;});// signal1conn2->Poll([&](const blinker::SignalId id, std::any data) {conn2CallbackCalled = true;auto p = std::any_cast<std::shared_ptr<Data>>(data);if (id == signal1->Id())std::cout << "value: " << p->value << std::endl;elsestd::cout << "value error!" << std::endl;});// signal2conn3->Poll([&](const blinker::SignalId id, std::any data) {conn3CallbackCalled = true;auto p = std::any_cast<std::shared_ptr<Data>>(data);if (id == signal2->Id())std::cout << "value: " << p->value << std::endl;elsestd::cout << "value error!" << std::endl;});// signal3conn4->Poll([&](const blinker::SignalId id, std::any data) {conn4CallbackCalled = true;auto p = std::any_cast<std::shared_ptr<Data>>(data);if (id == signal3->Id())std::cout << "value: " << p->value << std::endl;else std::cout << "value error!" << std::endl;});// all signalsconn5->Poll([&](const blinker::SignalId id, std::any data) {conn5CallbackCalled = true;auto p = std::any_cast<std::shared_ptr<Data>>(data);if (id == signal1->Id())std::cout << "value: " << p->value << std::endl;else if (id == signal2->Id())std::cout << "value: " << p->value << std::endl;else if (id == signal3->Id())std::cout << "value: " << p->value << std::endl;elsestd::cout << "value error!" << std::endl;});board.Flip();};tick();// still not called.tick();// called after flip
}int testLoops() {// Creates a board.blinker::Board board;// Creates signals.auto taskStarted = board.NewSignal("task.started");auto taskEnded = board.NewSignal("task.ended");auto actionStarted = board.NewSignal("action.started");// Creates connection to match some signals.auto connection = board.Connect("task.*");// Callback to be called on signal fire.auto callback = [&](const blinker::SignalId id, std::any data) {if (id == taskStarted->Id())std::cout << "signal taskStarted:";else if (id == taskEnded->Id())std::cout << "signal taskEnded:";else if (id == actionStarted->Id())std::cout << "signal actionStarted-:";std::cout << std::any_cast<int>(data) << std::endl;};// Assuming your main tick function here.for (int i = 0; i < 10; i++) {// Emit some signals (to backend).taskStarted->Emit(i);taskEnded->Emit(i);actionStarted->Emit(i);// Poll from frontend.connection->Poll(callback);// Flip double buffers.board.Flip();}return 0;
}void test() {testMatch();testValue();testLoops();
}
输出
value: 1
value: 2
value: 1
value: 2
value: 3
value: 1
value: 2
value: 3
signal taskStarted:0
signal taskEnded:0
signal taskStarted:1
signal taskEnded:1
signal taskStarted:2
signal taskEnded:2
signal taskStarted:3
signal taskEnded:3
signal taskStarted:4
signal taskEnded:4
signal taskStarted:5
signal taskEnded:5
signal taskStarted:6
signal taskEnded:6
signal taskStarted:7
signal taskEnded:7
signal taskStarted:8
signal taskEnded:8
参考
GitHub - hit9/blinker.h: A lightweight signal/event library for C++, similar to Python's blinker, but designed to work with ticking loops.
创作不易,小小的支持一下吧!


相关文章:
C++ 仿QT信号槽二
// 实现原理 // 每个signal映射到bitset位,全集 // 每个slot做为signal的bitset子集 // signal全集触发,标志位有效 // flip将触发事件队列前置 // slot检测智能指针全集触发的标志位,主动运行子集绑定的函数 // 下一帧对bitset全集进行触发清…...
联合概率密度函数
目录 1. 什么是概率密度由联合概率密度求概率参考链接 1. 什么是概率密度 概率密度到底在表达什么? 外卖在20-40分钟内送达的概率 随机变量落在[20,40]之间的概率。下图中,对总面积做规范化处理,令总面积1, f ( x ) f(x) f(x)则成…...
【Java10】成员变量与局部变量
Java中的变量只有两种:成员变量和局部变量。 和C不同,没有全局变量了。 成员变量,field,我习惯称之为**”属性“**(但这些年,因为attribute更适合被叫做属性,所以渐渐不这么叫了)。 …...
Spring Session与分布式会话管理详解
随着微服务架构的普及,分布式系统中的会话管理变得尤为重要。传统的单点会话管理已经不能满足现代应用的需求。本文将深入探讨Spring Session及其在分布式会话管理中的应用。 什么是Spring Session? Spring Session是一个用于管理HttpSession的Spring框…...
从0开始学习pyspark--Spark DataFrame数据的选取与访问[第5节]
在PySpark中,选择和访问数据是处理Spark DataFrame的基本操作。以下是一些常用的方法来选择和访问DataFrame中的数据。 选择列(Selecting Columns): select: 用于选择DataFrame中的特定列。selectExpr: 用于通过SQL表达式选择列。 df.select…...
Fastjson首字母大小写问题
1、问题 使用Fastjson转json之后发现首字母小写。实体类如下: Data public class DataIdentity {private String BYDBSM;private String SNWRSSJSJ;private Integer CJFS 20; } 测试代码如下: public static void main(String[] args) {DataIdentit…...
GuLi商城-商品服务-API-品牌管理-效果优化与快速显示开关
<template><div class"mod-config"><el-form :inline"true" :model"dataForm" keyup.enter.native"getDataList()"><el-form-item><el-input v-model"dataForm.key" placeholder"参数名&qu…...
如何成为C#编程高手?
成为C#编程高手需要时间、实践和持续的学习。以下是一些建议,可以帮助你提升C#编程技能: 深入理解基础知识: 确保你对C#的基本语法、数据类型、控制结构、面向对象编程(OOP)原则有深刻的理解。学习如何使用Visual Stud…...
SpringBoot学习06-[SpringBoot与AOP、SpringBoot自定义starter]
SpringBoot自定义starter SpringBoot与AOPSpringBoot集成Mybatis-整合druid在不使用启动器的情况下,手动写配置类进行整合使用启动器的情况下,进行整合 SpringBoot启动原理源码解析创建SpringApplication初始化SpringApplication总结 启动 SpringBoot自定义Starter定…...
Maven - 在没有网络的情况下强制使用本地jar包
文章目录 问题解决思路解决办法删除 _remote.repositories 文件代码手动操作步骤验证 问题 非互联网环境,无法从中央仓库or镜像里拉取jar包。 服务器上搭建了一套Nexus私服。 Nexus私服故障,无法连接。 工程里新增了一个Jar的依赖, 本地仓…...
JAVA--JSON转换工具类
JSON转换工具类 import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackso…...
每日复盘-20240705
今日关注: 20240705 六日涨幅最大: ------1--------300391--------- 长药控股 五日涨幅最大: ------1--------300391--------- 长药控股 四日涨幅最大: ------1--------300391--------- 长药控股 三日涨幅最大: ------1--------300391--------- 长药控股 二日涨幅最…...
MySQL 一些用来做比较的函数
目录 IF:根据不同条件返回不同的值 CASE:多条件判断,类似于Switch函数 IFNULL:用于检查一个值是否为NULL,如果是,则用指定值代替 NULLIF:比较两个值,如果相等则返回NULLÿ…...
一个使用率超高的大数据实验室是如何练成的?
厦门大学嘉庚学院“大数据应用实训中心”(以下简称“实训中心”)自2022年建成以来,已经成为支撑“大数据专业”复合型人才培养的重要支撑,目前实训中心在专业课程实验教学、项目实训、数据分析类双创比赛、毕业设计等方面都有深入…...
Chiasmodon:一款针对域名安全的公开资源情报OSINT工具
关于Chiasmodon Chiasmodon是一款针对域名安全的公开资源情报OSINT工具,该工具可以帮助广大研究人员从各种来源收集目标域名的相关信息,并根据域名、Google Play应用程序、电子邮件地址、IP地址、组织和URL等信息进行有针对性的数据收集。 该工具可以提…...
如何在Java中实现PDF生成
如何在Java中实现PDF生成 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在软件开发和企业应用中,生成PDF文档是一项常见的需求。Java作为一种强大…...
Redis 的缓存淘汰策略
Redis 作为一个高性能的内存数据库,提供了多种缓存淘汰策略(也称为过期策略或驱逐策略),用于管理内存使用。当 Redis 达到其内存限制时,系统会根据配置的策略删除一些数据,以释放内存空间。以下是 Redis 支…...
音乐播放器
目录 一、设计目标二、实现流程1. 数据库操作2. 后端功能实现3. 前端UI界面实现4. 程序入口 三、项目收获 一、设计目标 1. 模拟网易云音乐,实现本地音乐盒。 2. 功能分析: 登录功能窗口显示加载本地音乐建立播放列表播放音乐删除播放列表音乐 3.设计思…...
三星组件新的HBM开发团队加速HBM研发
为应对人工智能(AI)市场扩张带来的对高性能存储解决方案需求的增长,三星电子在其设备解决方案(DS)部门内部成立了全新的“HBM开发团队”,旨在提升其在高带宽存储器(HBM)领域的竞争力。根据Business Korea的最新报告,该团队将专注于推进HBM3、…...
图书馆数据仓库
目录 1.数据仓库的数据来源为业务数据库(mysql) 初始化脚本 init_book_result.sql 2.通过sqoop将mysql中的业务数据导入到大数据平台(hive) 导入mysql数据到hive中 3.通过hive进行数据计算和数据分析 形成数据报表 4.再通过sq…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
