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

事件监听器 + 回调处理器的事件循环系统

✅ 示例:C++ 持续监听 + 回调处理(支持并发)

🧩 效果说明

  • 注册多个事件及其处理函数

  • 主线程不停轮询是否有事件触发

  • 一旦事件触发,则自动调用对应的回调函数(由线程池处理)

#include <iostream>
#include <functional>
#include <unordered_map>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <vector>
#include <chrono>
#include <atomic>
#include <random>// ======= 简易线程池(同之前) =======
class ThreadPool {
public:ThreadPool(size_t thread_count) : stop_(false) {for (size_t i = 0; i < thread_count; ++i) {workers_.emplace_back([this]() {while (true) {std::function<void()> task;{std::unique_lock<std::mutex> lock(queue_mutex_);condition_.wait(lock, [this]() { return stop_ || !tasks_.empty(); });if (stop_ && tasks_.empty()) return;task = std::move(tasks_.front());tasks_.pop();}task();  // 执行任务}});}}void enqueue(std::function<void()> func) {{std::unique_lock<std::mutex> lock(queue_mutex_);tasks_.push(func);}condition_.notify_one();}~ThreadPool() {{std::unique_lock<std::mutex> lock(queue_mutex_);stop_ = true;}condition_.notify_all();for (std::thread &t : workers_) {if (t.joinable()) t.join();}}private:std::vector<std::thread> workers_;std::queue<std::function<void()>> tasks_;std::mutex queue_mutex_;std::condition_variable condition_;bool stop_;
};// ======= 事件监听器 + 回调注册系统 =======
class EventLoop {
public:using Callback = std::function<void()>;EventLoop(ThreadPool& pool) : pool_(pool), running_(true) {}void registerEvent(const std::string& event_name, Callback cb) {std::lock_guard<std::mutex> lock(cb_mutex_);callbacks_[event_name] = cb;}void trigger(const std::string& event_name) {std::lock_guard<std::mutex> lock(cb_mutex_);if (callbacks_.count(event_name)) {pool_.enqueue(callbacks_[event_name]);} else {std::cout << "[Warning] No callback for event: " << event_name << "\n";}}void startLoop() {std::thread([this]() {std::vector<std::string> event_names = {"connect", "message", "disconnect"};std::default_random_engine rng((unsigned)time(nullptr));std::uniform_int_distribution<int> dist(0, 2);while (running_) {std::string evt = event_names[dist(rng)];std::cout << "[EventLoop] Triggering event: " << evt << "\n";trigger(evt);std::this_thread::sleep_for(std::chrono::milliseconds(800)); // 模拟外部触发}}).detach();}void stopLoop() {running_ = false;}private:ThreadPool& pool_;std::unordered_map<std::string, Callback> callbacks_;std::mutex cb_mutex_;std::atomic<bool> running_;
};// ======= 主函数:监听并回调处理 =======
int main() {ThreadPool pool(4);EventLoop loop(pool);loop.registerEvent("connect", []() {std::cout << "[Callback] Connected handler @ thread " << std::this_thread::get_id() << "\n";});loop.registerEvent("message", []() {std::cout << "[Callback] Message handler @ thread " << std::this_thread::get_id() << "\n";});loop.registerEvent("disconnect", []() {std::cout << "[Callback] Disconnect handler @ thread " << std::this_thread::get_id() << "\n";});std::cout << "[Main] Start event loop...\n";loop.startLoop();std::this_thread::sleep_for(std::chrono::seconds(10));  // 监听 10 秒loop.stopLoop();std::cout << "[Main] Event loop stopped.\n";return 0;
}
  • 注册任意事件和回调处理器

  • 自动监听触发事件,后台线程处理逻辑

  • 支持并发处理多个事件

 

 

http://www.lryc.cn/news/578521.html

相关文章:

  • OpenCV CUDA模块设备层-----二值化阈值操作函数thresh_binary_func()
  • 设计模式精讲 Day 21:策略模式(Strategy Pattern)
  • 【STM32】 STM32低功耗模式详解:睡眠模式与唤醒机制【待测试】
  • 单元测试详解
  • 记录一个 Linux中脚本无法执行的问题
  • 构建淘宝评论监控系统:API 接口开发与实时数据采集教程
  • Camera相机人脸识别系列专题分析之十五:人脸特征检测FFD算法之libcvface_api.so算法API详细注释解析
  • Docker制作python环境
  • C++ 11 中 condition_variable 的探索与实践
  • 当足球遇上AI:赛事分析、伤病预测与智能裁判的崛起
  • postman入门篇
  • RabbitMQ - SpringAMQP及Work模型
  • k8s将service的IP对应的不同端口分配到不同的pod上
  • Vue 3 中的 `h` 函数详解
  • CAD文件处理控件Aspose.CAD教程:使用 Python 将绘图转换为 Photoshop
  • 【Python】字典get方法介绍
  • 面试拷打-20250701
  • 计网学习笔记第1章 计算机网络体系结构(灰灰题库)
  • 论文阅读笔记 NoPoSplat
  • 笔记/计算机网络
  • 动手学深度学习13.5. 多尺度目标检测-笔记练习(PyTorch)
  • 推客系统小程序终极指南:从0到1构建自动裂变增长引擎,实现业绩10倍增长!
  • (JAVA)自建应用调用企业微信API接口,实现消息推送
  • uniapp+vue写小程序页面,实现一张图片默认放大后,可以在容器内上下左右拖动查看
  • android13 如何定时输出app的帧率FPS
  • 应急响应类题练习——玄机第五章 Windows 实战-evtx 文件分析
  • mac重复文件清理,摄影师同款清理方案
  • COCO、VOC 和 YOLO三种主流目标检测数据格式的详细对比与示例说明
  • Java Selenium反爬虫技术方案
  • 笔记本电脑怎样投屏到客厅的大电视?怎样避免将电脑全部画面都投出去?