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

数据入队模块的-ExeModule

DataIn.ExeModule()方法解析

这个方法与刚才的 DataOut 是配对的——DataIn 是生产者(往队列写数据),DataOut 是消费者(从队列读数据)。对照着看会更容易理解。


1. 确保队列存在(懒创建)

if(!Solution.Ins.QueueDic.ContainsKey(QueueKey))Solution.Ins.QueueDic[QueueKey]=newJGTechVision.Services.DataOut(QueueKey);

和 DataOut 不同,DataIn不要求队列事先存在——如果全局字典里没有这个 key,就直接创建一个。这样无论哪个模块先运行,队列都能正常工作。


2. 定义槽位结构(只做一次)

if(!_slotsDefined){DefineAllSlots(outQueue);// 根据每个槽位的DataType,创建对应的List<double/int/string/bool>_slotsDefined=true;}

DefineAllSlots遍历所有启用的槽位,根据数据类型调用outQueue.DefineDoubleQueue()/DefineIntQueue()等,在队列内部初始化对应的List<T>。这个操作只执行一次_slotsDefined标志防止重复定义)。


3. 从上游取数据,写入队列

lock(outQueue){foreach(varslotinQueueSlots.Where(s=>s.IsEnable)){objectval=GetLinkValue(slot.LinkVar.Text);// 从上游模块获取值if(val==null)continue;intidx=slot.SlotIndex;switch(slot.DataType){case"double":vardList=(List<double>)outQueue.GetDataQueue(idx);if(dList.Count>=outQueue.LimitLength)dList.RemoveAt(0);// 满了就丢掉最旧的dList.Add(Convert.ToDouble(val));break;// ... int / string / bool 同理}}}

这里的核心逻辑:

  • GetLinkValue(slot.LinkVar.Text)LinkVar.Text存的是类似"&模块名.变量名"的引用字符串,GetLinkValue通过这个引用去上游模块拿到实际值。这是框架的变量链接机制——相当于画一条线把上游模块的输出接到本模块的输入。

  • 环形缓冲区(ring buffer)if (dList.Count >= outQueue.LimitLength) dList.RemoveAt(0)—— 如果队列已满(达到LimitLength上限),就丢掉最旧的那条数据(索引0),然后追加新数据。这保证了队列不会无限增长。


4. 唤醒消费者(关键一步)

if(Solution.Ins.QueueSignDic.ContainsKey(QueueKey))Solution.Ins.QueueSignDic[QueueKey].Set();

这就是和 DataOut 的signal.WaitOne(TimeOut)配对的地方。DataIn 写完数据后调用Set(),把信号量置为有信号状态,这会唤醒正在WaitOne阻塞等待的 DataOut 线程,让它立刻去读取数据。


DataIn vs DataOut 对照

DataIn(入队/生产者)DataOut(出队/消费者)
方向从上游模块拿值 → 写入队列从队列取值 → 暴露为输出参数
数据来源GetLinkValue(LinkVar.Text)变量链接GetSlotValue(outQueue, slot)从队列读
队列满时RemoveAt(0)丢弃最旧数据不适用(只读)
队列空时不关心根据IsWait决定阻塞等待还是报错
信号量signal.Set()唤醒对方signal.WaitOne(TimeOut)等待被唤醒
队列不存在时自动创建报错返回

一句话总结

DataIn 的ExeModule是一个带环形缓冲的生产者:它从上游模块通过变量链接拿到数据,按槽位和类型写入全局队列,写完后发信号唤醒等待中的 DataOut 消费者。队列满时自动丢弃最旧数据,防止内存无限增长。

http://www.gsyq.cn/news/1514651.html

相关文章:

  • 2026年深圳铝合金激光焊接厂家推荐榜单:铝制品/金属/钣金/全自动激光焊接工艺与技术实力深度解析 - 品牌发掘
  • 2026年太原刑事辩护律师推荐怎么选?看这五点关键不踩雷(蓝色河畔推荐) - 本地品牌推荐
  • MMD Tools终极指南:在Blender中完美融合MMD工作流
  • 进化算法讲义:遗传编程、进化编程与差分进化
  • 2026年酒店咖啡机设备厂商深度评测:谁在定义商用场景的新标准? - 优质品牌商家
  • 2026年防爆控制柜品牌选择指南:专业能力与市场格局深度分析 - 优质品牌商家
  • 黄金比例与神经认知系统的信息平衡机制
  • 2026年6月当下评价高的栏杆批发厂家推荐,景区石凉亭/庭院石凉亭/荔枝面青石板/石雕牌楼/石材护栏,栏杆门店选哪家 - 品牌推荐师
  • 基于B2B平台的医疗病历交互系统 | 毕业设计完整源码
  • VS2010环境下用C#调用Windows系统语音引擎实现文字朗读的可运行示例
  • wxPython Grid表格性能优化实战:处理上万行数据不卡顿的3个核心技巧
  • 2026厂房搬迁服务市场观察:哪些机构具备专业搬迁能力?——基于四川、广东、河南等多地案例的行业分析 - 优质品牌商家
  • 保姆级教程:在RK3588s开发板上用RGA库搞定YUV转RGB,CPU占用率实测不到30%
  • 什么是网络运营中心 (NOC)?——现代NOC团队的核心职能
  • 保姆级教程:用ArcGIS和MSPA插件提取生态源地(附避坑指南)
  • 2026年农机塑料轴套行业深度观察:耐磨、抗老化与精准适配成三大竞争维度 - 优质品牌商家
  • 2026年 工业空调供应厂家与省电方案综合解析 - 品牌发掘
  • 泉州思维博清洁设备夯实闽南厂区环卫清洁设备供应实力
  • 012、UART高级应用:多机通信、流控制、环形缓冲区与FIFO管理
  • 2026年嘉兴挖机出租哪家好?5家本地专业机械租赁商推荐 - 本地品牌推荐
  • Zig编程中的参数传递策略
  • 济南GEO优化服务商专业榜:2026年6月企业选型盘点与靠谱机构梳理 - 外贸老黄
  • 芯片编程烧写烧录座口碑厂家究竟有何独到之处?
  • 2026年浅层砂过滤器行业观察:技术迭代与供应商能力全景分析 - 优质品牌商家
  • 告别“人工搬砖”!实测实在Agent:自研大模型智能体如何重构业务自主规划流程?
  • 别再只盯着PLL原理了!手把手教你用ADI的ADF4351芯片搞定一个低相位噪声的2.4GHz信号源(附环路滤波器计算)
  • 告别网盘限速烦恼:LinkSwift让你的下载体验飞起来
  • 手把手教你用Mission Planner地面站玩转ArduPilot:从固件烧录到自动巡航实战
  • 从微信聊天窗到仪表盘:拆解3个真实软件界面,看SplitContainer和TableLayoutPanel如何混搭出高级感
  • 别再手动算潮汐了!用MATLAB的S_Tide工具箱搞定调和分析与预报(附钏路数据实战)