该定时器引擎基于线程驱动 时间片轮询 队列事件分发的核心思路实现整体架构分为定时器管理、定时线程驱动、事件分发三个核心模块以下是详细的实现流程和原理一、核心设计思路时间片轮询通过独立线程以固定时间间隔默认 25ms触发时间检查避免高频系统调用降低资源消耗定时器对象池维护 “空闲 / 活跃” 定时器链表复用定时器对象减少内存分配开销事件队列分发定时器到期后不直接执行逻辑而是将事件投递到队列服务由业务层异步处理解耦定时器核心与业务逻辑。二、核心组件与依赖组件作用CTimerThread定时器驱动线程以固定时间片睡眠后触发时间检查CTimerEngine定时器核心管理器负责定时器的增删、时间计算、到期事件投递CQueueServiceEvent事件投递器将到期的定时器事件投递到队列服务IQueueServiceCQueueService队列服务接收定时器事件并异步分发给业务层的回调接口三、完整实现流程1. 初始化阶段BeginService// TimerEngine.cpp - CTimerEngine::OnTimerThreadSink void CTimerEngine::OnTimerThreadSink() { CThreadLockHandle LockHandle(m_ThreadLock); // 1. 无活跃定时器则直接返回 if (m_dwTimeLeaveNO_TIME_LEFT) return; // 2. 累计已过时间更新剩余时间 m_dwTimeLeave - m_dwTimerSpace; m_dwTimePass m_dwTimerSpace; // 3. 检查是否有定时器到期m_dwTimeLeave0表示到检查点 if (m_dwTimeLeave0) { DWORD dwTimeLeaveNO_TIME_LEFT; for (INT_PTR i0;im_TimerItemActive.GetCount();) { tagTimerItem* pTimerItem m_TimerItemActive[i]; // 计算当前定时器剩余时间 pTimerItem-dwTimeLeave - m_dwTimePass; // 4. 定时器到期 if (pTimerItem-dwTimeLeave0L) { // 投递定时器事件到队列服务 m_AttemperEvent.PostTimerEvent(pTimerItem-wTimerID, pTimerItem-wBindParam); // 5. 处理重复次数 if (pTimerItem-dwRepeatTimes ! TIMER_REPEAT_TIMER) { if (pTimerItem-dwRepeatTimes1) { // 单次定时器移到空闲池 m_TimerItemActive.RemoveAt(i); m_TimerItemFree.Add(pTimerItem); bKillTimertrue; } else { // 多次定时器减少次数重置剩余时间 pTimerItem-dwRepeatTimes--; pTimerItem-dwTimeLeave pTimerItem-dwElapse; } } else { // 无限重复重置剩余时间 pTimerItem-dwTimeLeave pTimerItem-dwElapse; } } // 6. 更新全局最近到期时间 if (!bKillTimer) { i; dwTimeLeave__min(dwTimeLeave, pTimerItem-dwTimeLeave); } } // 7. 重置时间累计准备下一轮 m_dwTimePass0L; m_dwTimeLeavedwTimeLeave; } }CTimerEngine::SetTimer → 初始化定时器 → CTimerThread25ms轮询→ OnTimerThreadSink检查到期 → CQueueServiceEvent::PostTimerEvent → CQueueService::AddToQueue → 队列线程异步触发业务回调总结该定时器引擎是典型的 “时间片轮询 对象池 事件队列” 实现兼顾了性能、线程安全和业务解耦适合服务端高并发场景下的定时任务管理。