命令模式思想与 EvSim 事件调度

发布时间:2026/10/28 10:24:17

命令模式思想与 EvSim 事件调度 命令模式把一次操作请求封装成对象使请求能够被保存、传递、排队并在合适的时候执行。本文结合 EvSim 的事件机制说明事件如何表达动作以及事件队列和世界对象如何共同完成调度。在程序中执行一个动作最直接的方式就是调用一个函数。例如让车辆移动就调用移动函数让雷达探测就调用探测函数。这种方式简单清楚适合立即执行的操作。随着系统变复杂我们往往需要进一步管理这些动作有的动作要等到指定时间执行有的动作需要按优先级排序有的动作要周期性重复还有的动作在执行前可能被取消。此时程序需要同时处理动作的实现和动作的组织方式。例如让某个组件在仿真时间 10 秒时更新一次可以被封装成一个事件对象。这个对象记录执行时间、优先级、操作目标并提供统一的执行入口。系统先保存这个对象等时间到达再调用它的执行方法。这样提出请求和执行请求就可以发生在不同的位置、不同的时间。在 EvSim 项目中EvEvent 承担了命令对象的角色。它的核心接口可以简化为下面的形式。class EvEvent { public: enum class EvDisposition { Delete, Reschedule }; virtual ~EvEvent() default; virtual EvDisposition execute() 0; };这里最关键的是 execute()。不同的事件可以执行完全不同的操作但都通过这个统一入口被调用。调度代码只需要持有 EvEvent 指针就能管理多种具体事件。EvEvent 还包含执行时间 time、优先级 priority、执行开关 shouldExecute 等信息。这些字段让一次操作请求具备了可调度、可控制的形式。命令模式中的几个角色在项目中可以这样对应。模式角色项目中的对应对象职责命令接口EvEvent规定统一的执行入口具体命令EvComponentUpdateEventEvOneShotEvent 等实现具体操作调用者EvWorld在合适的时机调用 execute()接收者EvComponent 或回调操作的业务对象完成实际业务工作请求创建方组件调度代码或其他业务代码创建并提交事件这里还需要一个保存待执行命令的地方项目使用的是 EvEventQueue。EvEventQueue 内部使用 unique_ptr 持有多个事件对象并按照执行时间、优先级、入队顺序排序。时间越早越先出队时间相同优先级数值越小越先出队前两项都相同则按照入队先后排序。EvEventQueue 是命令的组织容器EvWorld 承担执行调度的职责。仿真推进时EvWorld 从队列中取出到期事件检查其是否允许执行再调用 execute()。单线程调度路径逐个执行事件并行调度路径还会根据优先级和 affinityKey 进行分批与分组。以组件周期更新为例组件通过调度代码创建 EvComponentUpdateEvent把更新请求加入队列。到达计划时间后世界对象调用事件的 execute()事件再调用组件的更新逻辑。下面是其中的关键流程省略了生命周期和状态检查。// 执行本次组件更新 if (!com-executeScheduledUpdate(time(), mEpoch)) { return EvDisposition::Delete; } // 安排下一次执行时间 setTime(time() com-updateInterval()); return EvDisposition::Reschedule;如果组件的更新间隔是 0.1 秒那么一次执行结束后事件会把自己的执行时间增加 0.1 秒并返回 Reschedule。EvWorld 收到这个结果再把事件放回队列于是形成连续的周期更新。当组件不再满足执行条件时事件返回 Delete该事件对象随之释放。这个过程体现了命令模式的价值业务对象专注于具体动作调度系统统一管理执行时机以及执行后的处理方式。组件负责更新自身状态事件负责包装这次更新请求队列负责组织待执行请求世界对象负责推动执行。各部分通过明确的接口协作减少了调度代码对具体业务的依赖。以后增加一种新的操作例如某个时刻触发一次探测只要提供相应的具体事件并提交给现有调度机制就可以复用事件队列和执行流程。调度系统仍然通过统一的 execute() 接口调用它。命令也可以包装函数而不必为每一个小动作都编写新的事件类。项目中的 EvOneShotEvent 接收一个回调执行后结束EvRecurringEvent 则允许回调决定是否再次调度。这使系统既能使用专门的事件类表达复杂行为也能用回调表达简单操作。排队、延迟执行、周期调度是这个项目在命令对象基础上实现的能力。其他系统还可以为命令增加执行记录、重试或撤销功能但这些都需要额外设计。例如要撤销一次操作就需要保存操作前的状态或提供能够恢复状态的逆向操作。当前 EvEvent 的公共接口主要围绕执行与重新调度展开。命令模式也有使用成本。一次简单调用被包装成对象后会增加事件创建、对象生命周期和调用路径的管理工作。适合采用它的场景通常是操作请求确实需要统一排队、延后执行或集中调度。在 EvSim 中仿真时间推进、事件优先级和组件周期更新都需要这种统一管理。因此把动作封装为 EvEvent再交给 EvEventQueue 和 EvWorld 处理让不同的仿真行为能够接入同一套调度机制。后续扩展新的行为时主要增加具体事件及其业务逻辑已有调度流程就能继续发挥作用。
延伸阅读

更多相关文章

2026/10/28 10:24:17

园区问数平台接进来后,第一次对不上数,我是这么查的

上周三下午,运营小王在问数平台敲了一句话,三号楼这个月收缴率多少。平台回了他一个数,92%。半小时后财务老李把月度报表甩进群里,三号楼收缴率 87%。差了五个点。群里一下安静了。这件事后来成了我们接问数平台最值钱的一课。把排…

2026/10/28 10:24:17

BV2细胞“测不出”的突触修剪:云克隆大鼠原代小胶质细胞在补体–C1q–疼痛机制研究中的应用指南

在神经科学领域,小胶质细胞长期被置于神经元和星形胶质细胞的阴影之下。它们仅占中枢神经系统胶质细胞的5%至10%,却承担着大脑中最具“外科手术”性质的工作。近五年的研究揭示,小胶质细胞并非简单的免疫清道夫,而是通过精确的突触…

2026/10/28 10:24:17

大华网络摄像机配置指南(ConfigTool 快速配置)

本文为大华网络摄像机配置指南,适用于船载终端接入的“驾驶舱监控”设备。涵盖配置前准备、初始化、IP修改、WEB登录及项目落地信息,重点强调需同步更新数据库t_equip_camera中的IP与密码,确保后端SDK与H5播放器(rtspoverwebsocket)正常调用。建议关闭UPnP、强密码管理,保…

2026/10/28 11:35:12

三星闭源ROM系统APK修改:odex合并与apk manager汉化实战

简介:这份文档面向需要深度定制三星等闭源 Android 系统应用的中高级玩家与 ROM 爱好者,聚焦 APK 与 ODEX 的合并处理,解决系统应用在缺少源码、签名受限条件下难以反编译、汉化与重新打包的问题。压缩包共 1 个 docx 文件,约 23K…

2026/10/28 11:35:12

SAS与SATA桥接芯片解析:双端口冗余与扇区转换原理

简介:这份资源是 Marvell 88SF9110B0 的官方数据手册,面向从事企业级存储系统设计、SAS/SATA 桥接方案选型与调试的硬件工程师及嵌入式开发者。芯片为 6Gb/s SAS 到 SATA 桥接器件,可让标准单端口 SATA 硬盘或固态盘以双端口 SAS SSP 目标设备…

2026/10/28 11:35:12

Windows下Memcached安装配置与性能优化指南

1. Windows环境下Memcached安装指南Memcached作为一款高性能的分布式内存对象缓存系统,在Web应用性能优化中扮演着重要角色。不同于Linux环境下相对简单的安装流程,Windows平台上的部署往往会让开发者遇到各种"水土不服"的问题。本文将基于最新…

2026/10/28 11:35:12

Git代码提交统计技巧与实战经验分享

1. 项目背景与核心需求在团队协作开发中,我们经常需要统计某个时间段内的代码提交频率。比如领导问"上季度我们团队在XX项目上投入了多少开发资源",或者你想分析自己最近一个月的工作节奏。这时候如果手动翻git log,既低效又容易出…

2026/10/28 11:35:12

Transformer数学本质:贝叶斯推理与几何动力学解析

1. 项目概述Transformer架构自2017年提出以来,已成为深度学习领域的基石模型。但大多数研究者仅停留在应用层面,鲜少有人深入探讨其数学本质。本文将揭示Transformer与贝叶斯推理之间的深刻联系,并从几何与动力学双重视角构建统一的理论框架。…

2026/10/28 11:30:11

DeepSeek本地部署实战:Ollama、显存核算与API接入

简介:这份PDF文档面向AI技术爱好者、企业IT管理员与开发者,聚焦在本地环境部署DeepSeek大语言模型的完整流程与安全可控价值,帮助需要处理敏感信息、构建私有化AI服务的读者规避数据上云风险,并掌握模型定制与垂直场景优化的方法。…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑