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

数据出队模块的-ExeModule

ExeModule()方法逐段解析

整体角色

这个模块叫“数据出队”,它的核心职责是:从一个全局共享队列中取出数据,暴露为本模块的输出参数,供下游模块使用。


1. 入口计时

Stopwatch.Restart();

重启一个秒表,用于性能监控/调试,记录本次执行耗时。


2. 防御性校验

if(string.IsNullOrEmpty(QueueKey)){...returnfalse;}if(!Solution.Ins.QueueDic.ContainsKey(QueueKey)){...returnfalse;}
  • QueueKey是队列的名称标识(默认"QueueDefault"),不能为空。
  • Solution.Ins.QueueDic是一个全局字典,存着整个解决方案里所有的队列实例。这里检查这个 key 对应的队列是否存在。

3. 阻塞等待模式(IsWait

if(IsWait){varsignal=Solution.Ins.QueueSignDic[QueueKey];// 取出这个队列对应的"信号量"boolhasData=false;lock(outQueue){// 遍历所有启用的槽位,看有没有数据foreach(varslotinQueueSlots.Where(s=>s.IsEnable))if(GetSlotCount(outQueue,slot)>0){hasData=true;break;}}if(!hasData)signal.WaitOne(TimeOut);// 阻塞等待,直到有人"发信号"或超时}

这里的关键概念:

  • QueueSignDic是一个Dictionary<string, AutoResetEvent>,每个队列配一个AutoResetEvent(一种线程同步信号)。
  • IsWait = true时,模块不会立即失败,而是先检查队列里有没有数据。
  • 如果所有槽位都为空,就调用signal.WaitOne(TimeOut)— 当前线程阻塞在这里,直到:
    • 另一个模块(比如 DataIn 入队模块)往队列里放数据后调用了signal.Set(),或者
    • 超时时间TimeOut(默认5000毫秒)到了。

这实现了一个生产者-消费者模式:入队模块生产数据并 Set 信号,出队模块 WaitOne 等待消费。


4. 从每个槽位取数据

lock(outQueue){foreach(varslotinQueueSlots.Where(s=>s.IsEnable)){intcount=GetSlotCount(outQueue,slot);if(count==0){if(!IsIgnoreError)// 不忽略错误 → 报错返回{...returnfalse;}continue;// 忽略错误 → 跳过这个槽位}slot.LastValue=GetSlotValue(outQueue,slot);// 取最后一个值}}
  • QueueSlots是一个槽位列表,每个槽位有:索引(SlotIndex)、名称(SlotName)、数据类型(DataType)。
  • GetSlotCount:根据槽位索引和数据类型,拿到内部List<T>的元素个数。
  • IsIgnoreError控制行为:
    • true(默认):某个槽位没数据就跳过,继续处理下一个。
    • false:某个槽位没数据就直接报 NG,整个模块执行失败。
  • GetSlotValue:取队列最后一条数据,赋值给slot.LastValue。如果IsDeleteData = true,取数据的同时还会把它从队列中移除(消费掉)。

5. 输出参数 & 状态

AddOutputParams();ChangeModuleRunStatus(eRunStatus.OK);returntrue;

AddOutputParams()把每个槽位的LastValue注册为模块的输出参数(名称用SlotName,类型用DataType),这样下游模块就能通过连线拿到这些值。


一句话总结

这个方法就是一个带超时等待的队列消费者:它从全局共享队列的各个槽位里取出最新数据,转成模块的输出参数,并支持"有数据才继续 / 没数据就等"的同步模式。

http://www.rkmt.cn/news/1514656.html

相关文章:

  • 2026年聚氨酯制品选购实战指南:从材料参数到供应商能力全解析 - 优质品牌商家
  • 5个步骤掌握LaserGRBL:免费开源激光雕刻控制软件终极指南
  • Harness 中的会话压缩归档与懒加载
  • Java毕设选题推荐:基于 Java 的学生活动报名管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • UIDesign完整解析
  • 机器学习在拓扑分类中的捷径学习现象解析
  • 基于西门子plc的高炉运矿皮带拣铁装置的控制系统设计31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_可以扫码
  • 2026年声光报警器品牌厂家哪家靠谱?深度评测行业格局与技术趋势 - 优质品牌商家
  • 微信聊天记录导出完整指南:3步备份你的珍贵数字记忆 [特殊字符]️
  • 2026年知名的断桥铝门窗/山西断桥铝门窗/定制断桥铝门窗稳定供货厂家推荐 - 行业平台推荐
  • Android进程永生终极方案:基于Linux内核的黑科技保活技术突破
  • 2026年闪蒸干燥机品牌选择指南:多维度分析常州天掣、瑞博环保与成都尚林 - 优质品牌商家
  • paperxie 告别 Word 折磨!四千校模板 AI 一键规整论文格式,定稿不再卡版式
  • Java毕设选题推荐:基于 Java 的校园选课评价综合管理平台的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Arduino传感器信号不稳?可能是缺了这个RC滤波电路!从原理到代码的避坑指南
  • 2026年塑钢缠绕管制造厂实力之选:SRWPE市政雨污分流/高环刚度抗压/大口径加厚排水管,地埋耐腐蚀/小区改造/水利输水生产商精选 - 品牌发掘
  • 用assign搞定组合逻辑:从门电路到Verilog代码的保姆级映射教程
  • ABB 直流调速器 DCS800-S01-0405-05
  • 2026年优质篮球馆木地板行业观察:七家实力供应商多维度解析与案例参考 - 优质品牌商家
  • 【CSDN】----再踩坑!CSDN 专栏数量受限?等级积分提升攻略来了
  • allegro(cadence)PCB设计DRC分析
  • 华大HC32F460JETA点灯踩坑记:为什么我的LED不受控制?附官方库延时函数详解
  • 2026年广州温度传感器热电偶与测温方案甄选:K型、J型、PT100铂电阻及非标定制评估 - 品牌发掘
  • FigmaCN浏览器扩展深度解析:基于DOM实时监测的中文界面本地化方案
  • 2026年电线电缆回收行业观察:哪家更靠谱?真实企业实力与案例深度解析 - 优质品牌商家
  • SOON模型:深度学习在S2S天气预报中的物理约束与优化
  • Android原生个人信息页组件:矢量图标动态着色+点击按压反馈
  • 深入探讨C++中的指针与偏移量
  • 计算机视觉:视觉 Transformer 的注意力机制与工程优化,ViT 架构的深度解析
  • Android App接入腾讯地图SDK实现高精度定位与地图渲染