事件监听器 + 回调处理器的事件循环系统
✅ 示例: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;
}
-
注册任意事件和回调处理器
-
自动监听触发事件,后台线程处理逻辑
-
支持并发处理多个事件