颓废的郁闷 2022-07-27 18:09 采纳率: 100%
浏览 41
已结题

C# 窗体之间,字符怎么能做到实时传递??

最近做个上位虚拟机,主窗体通过指定本地的IP和端口号,通过UDP的方式收到数据,比如,每秒收到一串数据,
内容:电压1多少伏,电压2多少伏,电流1多少安,电流2多少安,温度1多少度,温度2多少度,就这几项把,主窗体我用的是TEXT控件把解析出来的内容塞上去显示的。

现在的问题就是,我在主界面上,加了按钮,弹出个子窗口,把主窗口的解析后的数据也在子窗体上显示出来,不知道该怎么写了,,
就是,主窗体每秒收到的6项数据,怎么能实时传递给子窗体(打开情况下)。

img

  • 写回答

4条回答 默认 最新

  • wanghui0380 2022-07-28 11:17
    关注

    额,2022年了,连当初被喷的最弱的js都更新好几代了,MVVM是js前端最主流的开发了,就连lamda表达式,async/await都是js的标配了,甚至你们从来就不肯正眼瞧瞧的Rx都是前端3大框架之一的 reactJs的核心支撑。

    而这一切都是你们一直鄙视的某软最先带入主流开发的,而国内neter们到底在干啥么?
    来吧,先说说MVVM把

    1. 为啥非要强调啥窗体。啥父子,啥构造,啥timer。扔掉不好么。

    伪描述

      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; }
    }
    
    
    
    
    
    
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月5日
  • 已采纳回答 7月28日
  • 创建了问题 7月27日

悬赏问题

  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line