C#获取不断变化的数据

上位程序输出结果保存在一个txt中,一个数字(计数),一个型号(A,B,C),这个文本中的计数每隔数秒就会++(正常情况这个数字只增不减),然后每隔一段时间,型号会变,随着型号改变,计数会归零重记,每天0点也会归零。

下位程序要求,获取这个计数,并且根据类型统计每个型号当前小时总数。

卡在一个地方,就是当类型归零,我正在获取的计数也归零,因为我用了time控件定时去读取那个txt,他一个归零,我的统计就废了。希望求个思路。

补充一点,我开始接收数据时间随机,已经产生计数和型号随机。我是属于半路开始接收。

准备一个List,将数据的变化情况记录在List里面,因为你也提到了,需要分型号统计每个小时的计数,所以List里面也需要存一下时间信息的。
先准备个数据模型类,存储你的计数开始时间,停止时间,型号和计数数值,加在List里面,作为List的模板记录用,在用户点击界面上的按钮,查看每小时的数据时,这时根据List里的记录再来算。

具体在什么时候向List加数据,我建议在每次读到型号改变时,将上次的数据加在List里面(用来记录上次的型号和计数),然后采集这时的时间,作为上次数据的结束时间和下次数据的开始时间。

其次你提到的0点会重置,并且要算每个小时的数据,所以整点时肯定也需要记录一次的。

最后说说怎么算这个每小时的计数值,筛选出List中,起始时间和终止时间都在这个小时时间范围内的数据,这时List中大概是这样的:
list[0] starttime:2022/8/19 10:00:00 endtime:2022/8/19 10:05:23 nums:50 xinghao:A
list[1] starttime:2022/8/19 10:05:23 endtime:2022/8/19 10:12:56 nums:28 xinghao:B
list[2] starttime:2022/8/19 10:12:56 endtime:2022/8/19 10:25:33 nums:70 xinghao:C
..............
list[n] starttime:2022/8/19 10:56:02 endtime:2022/8/19 11:00:00 nums:21 xinghao:A
需要注意的是,list[0]中是由于整点采集进行人工截断的数据,计数值很可能包含上一小时的一部分,以上面的数据为例,需要找到以 2022/8/19 10:00:00 结尾的那笔数据的计数,然后用list[0]中的数值50减去这个数,就能得到真实数值,最后直接遍历list,把相同类型的数值加起来就好了。

//数据模型大概像这样
public class Data()
{
//计数开始时间
//计数停止时间
//计数数值
//型号
}

//然后List像这样
List<Data> list=new List<Data>();

增加协议需要归零的时候通知你,你统计完成后通知上位机。上位机接受你的通知归零。

不好回答啊,可能理解不一样把

为啥需要你计数?你都说了,人家统计好了,你负责显示就好
同样你自己也说了,你都可能是半途加进去的,那么你来计数,你说你还要清零。那么凭啥归你清零呢?

所以按你们两边商量的逻辑,归你做的事情为
1.显示当前“批次”在做啥型号,做了多少次(按你的说法,我理解为有个质检可以检测多个产品,当前批次在检测产品A,然后他给了一个计数,说当前批次当前检查了几个)
2.每批次结束把当前批次信息入库
---------------就像你说什么更换,什么清零就是这个动作,但是我的说但是,但是你说你有个time定时器,问题来了,在你定时的不到的期间,他换批次了,然后重新计数了,会发生什么事情。那就是你无法准确获取上一个批次的总数,因为他是在你定时器睡觉的时候改变的,所以你不知情。你就只能问“我是谁,发生了什么,怎么突然就变了”


所以总体上这种实现方式是不对的,如果是古早的代码,这东西你就直接开放自己的数据库给他,让他直接往数据里写。
如果你们不能往数据库里写,那么楼上也提出了,让他按时间目录,按类型分文件写。别写一个txt

如果是现在的代码,我们通常是mqtt,kafaka,他写他的你别管。你从实时计算那边拿统计数据,至于实时计算的OLAP也好,spark这类那是另外的事情并不归属你的任务

小问题,通过监控系统文件事件来感知这个文件有没有被修改或这个目录有没有新增文件,根据捕获的文件名称去读取,那么就是实时监控了,数据做统计就更简单了。晚上有时间给你写下。

我建议你这样干:
1、上位机上部署一个小程序,这个程序把TXT中的数据,放到数据库中。
2、其它程序从数据库来取数,想怎么处理数据都可以。

这样的设计,既有完整的数据记录,又避免读写冲突,非常可靠,后面还方便各种场景处理加工数据。

建议了解一下“有限状态自动机”

加个缓存?key是时间,value是一个类(属性是计数和类型),前后端分别往缓存中存取数据。

那么复杂干吗,自己计数啊,干嘛要用他的计数呢,你的计数一直累加就好了嘛。