最近做个上位虚拟机,主窗体通过指定本地的IP和端口号,通过UDP的方式收到数据,比如,每秒收到一串数据,
内容:电压1多少伏,电压2多少伏,电流1多少安,电流2多少安,温度1多少度,温度2多少度,就这几项把,主窗体我用的是TEXT控件把解析出来的内容塞上去显示的。
现在的问题就是,我在主界面上,加了按钮,弹出个子窗口,把主窗口的解析后的数据也在子窗体上显示出来,不知道该怎么写了,,
就是,主窗体每秒收到的6项数据,怎么能实时传递给子窗体(打开情况下)。
最近做个上位虚拟机,主窗体通过指定本地的IP和端口号,通过UDP的方式收到数据,比如,每秒收到一串数据,
内容:电压1多少伏,电压2多少伏,电流1多少安,电流2多少安,温度1多少度,温度2多少度,就这几项把,主窗体我用的是TEXT控件把解析出来的内容塞上去显示的。
现在的问题就是,我在主界面上,加了按钮,弹出个子窗口,把主窗口的解析后的数据也在子窗体上显示出来,不知道该怎么写了,,
就是,主窗体每秒收到的6项数据,怎么能实时传递给子窗体(打开情况下)。
额,2022年了,连当初被喷的最弱的js都更新好几代了,MVVM是js前端最主流的开发了,就连lamda表达式,async/await都是js的标配了,甚至你们从来就不肯正眼瞧瞧的Rx都是前端3大框架之一的 reactJs的核心支撑。
而这一切都是你们一直鄙视的某软最先带入主流开发的,而国内neter们到底在干啥么?
来吧,先说说MVVM把
伪描述
public class 采集指标
{
public 静态 单件采集指标 Inatance {get}
public IasyncEnumerable<指标对象> 异步指标流() //这里我直接用 IasyncEnumerable异步流,下面我就省略async/await的说明了
}
有这全局静态单件,你在任意地方皆可访问,不必关心啥啥窗体。啥父子,啥构造
2.为了解决这样的东西,同时为了个MVVM领域在普通net程序员里流行,某软还给了其他的东西,比如Chanel频道对象,当然在更早的时候,还给了你Rx
你上一个问题是我们移动窗口,我们来看看Rx时间移动窗口怎么弄
还是MvvM,没有啥窗口,没有啥父子,所以我直接控制台好了,免得一讨论就timer,控件去了
using System.Collections;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Threading.Channels;
//使用rx,后面有能力使用各种操作符对数据进行再加工
//我这里演示平滑移动窗口,缓存1M内数据,但是窗口平滑移动半秒,Buffer是缓存,实际上rx还有一个差不多操作符叫Window,
//原理一样,只不过一个是buffer缓存后给数据,window是按参数分割但是还是来一个给一个
//后面图表我到不希望他来一个给一个,我希望1秒刷一次,所以用buffer
采集指标.Instance.指标数据流().Buffer(TimeSpan.FromSeconds(1), TimeSpan.FromMilliseconds(500)).Subscribe(p =>
{
Console.WriteLine($"最近1秒内数据:{string.Join(",",p.Select(c=>c.电压))}");
});
Console.ReadKey();
public class 采集指标
{
private readonly static Lazy<采集指标> lazy = new Lazy<采集指标>(() => new 采集指标());
private Subject<testobj> _source=new Subject<testobj>();
public static 采集指标 Instance => lazy.Value;
public 采集指标()
{
//你怎么从udp接收我不管了,我们直接模拟
//模拟数据方法
mockdata();
}
private void mockdata()
{
//模拟数据,每100ms产生一个模拟数据
Observable.Interval(TimeSpan.FromMilliseconds(100)).Subscribe(p =>
{
_source.OnNext(new testobj()
{
电压=p
});
});
}
//我这里展示的是RX,后面的出的IAsyncEnumerator<>, Channel我就不介绍了,大同小异
//之所以用rx其实是因为rx的操作符多点,后面有能力去做其他的事情,比如你后面图表可能需要移动窗口
public IObservable<testobj> 指标数据流()
{
return _source.Publish().RefCount();
}
}
public class testobj
{
public float 电压 { get; set; }
}