首先实现一个基于任务队列的事件循环,通过post添加任务,run启动循环执行任务,stop停止循环,示例中演示了延时任务和自动退出机制。

在C++中实现一个简单的事件循环,核心是维护一个任务队列,并在一个循环中不断检查并处理这些任务。这种机制常用于GUI程序、网络服务或异步编程中。下面介绍一种基于函数对象和标准库的轻量级实现方式。
基本思路
事件循环的本质是“等待事件 -> 处理事件”的重复过程。我们可以把“事件”抽象为可调用的对象(如函数、lambda表达式),放入队列中,由主循环依次取出并执行。关键组件:
- 一个任务队列(std::queue<:function>>)
- 一个主循环,不断从队列中取出任务执行
- 线程安全控制(可选,简单版本可以不考虑)
- 退出机制(例如通过标志位控制循环)
代码实现
以下是一个最简版本的事件循环实现:#include <iostream>
#include <queue>
#include <functional>
#include <thread>
#include <chrono>
class SimpleEventLoop {
private:
std::queue<std::function<void()>> taskQueue;
bool shouldStop = false;
public:
// 添加任务到队列
void post(std::function<void()> task) {
taskQueue.push(task);
}
// 运行事件循环
void run() {
while (!shouldStop) {
if (!taskQueue.empty()) {
auto task = taskQueue.front();
taskQueue.pop();
task(); // 执行任务
} else {
// 没有任务时,短暂休眠避免CPU空转
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
}
// 停止事件循环
void stop() {
shouldStop = true;
}
};使用示例
下面演示如何使用这个事件循环添加几个任务:int main() {
SimpleEventLoop loop;
// 添加一些任务
loop.post([]() { std::cout << "任务1: Hello\n"; });
loop.post([]() { std::cout << "任务2: World\n"; });
// 模拟延迟任务(实际中可用定时器)
std::thread([&loop]() {
std::this_thread::sleep_for(std::chrono::seconds(2));
loop.post([]() { std::cout << "任务3: 2秒后执行\n"; });
}).detach();
// 运行2.5秒后停止
std::thread([&loop]() {
std::this_thread::sleep_for(std::chrono::milliseconds(2500));
loop.stop();
}).detach();
std::cout << "事件循环开始...\n";
loop.run();
return 0;
}注意事项与扩展
这个实现适合学习和简单场景,若用于生产环境可考虑以下改进:- 加锁保护任务队列,支持多线程post任务
- 引入定时任务机制(如带时间戳的任务)
- 结合I/O多路复用(如epoll、select)实现更高效的等待
- 使用智能指针管理任务生命周期
基本上就这些。一个简单的事件循环不需要复杂设计,关键是理解“任务入队、循环执行”的模型。随着需求增长再逐步增强功能即可。



















