c# 实时曲线图示例代码

下面是详细的“c# 实时曲线图示例代码”攻略。

简介

实时曲线图常用于数据采集与监控领域,其实现方法主要通过定时器事件或者数据缓存方式进行数据刷新。在c#中可以使用WPF或WinForm两种方式实现绘制实时曲线。

在实现实时曲线之前,我们需要掌握以下知识点:

  • 定时器
  • 数据缓存
  • 绘制曲线

实现方法

使用定时器实现

  1. 创建WinForm或WPF项目,并添加图表控件。

  2. 添加定时器控件,并设置定时器的时间间隔。

  3. 在代码中定义数据源和定时器事件:

private List<double> dataList = new List<double>();
private Timer timer;
private void InitTimer(){
    timer = new Timer();
    timer.Interval = 1000;
    timer.Tick += Timer_Tick;
    timer.Start();
}

private void Timer_Tick(object sender, EventArgs e){
    //获取最新的数据(可通过串口、socket等方式获取)
    //将最新数据添加到数据源中
    dataList.Add(1.0);
    chart1.Series[0].Points.Clear();
    for (int i = 0; i < dataList.Count; i++) {
        chart1.Series[0].Points.AddY(dataList[i]);
    }
    //绘制图形
    chart1.Invalidate();
}
  1. 将数据源绑定到图形控件,并绘制出来:
private void Form_Load(object sender, EventArgs e)
{
    chart1.Series.Clear();
    chart1.Series.Add(new Series());
    chart1.Series[0].ChartType = SeriesChartType.Line;
}

使用数据缓存实现

  1. 创建WinForm或WPF项目,并添加图表控件。

  2. 在代码中定义数据源和绘制事件:

private List<double> dataList = new List<double>();
private void DrawChart(){
    //绘制图形
    chart1.Series[0].Points.Clear();
    for (int i = 0; i < dataList.Count; i++){
        chart1.Series[0].Points.AddY(dataList[i]);
    }
}

private void DataReceived(double data){
    //将最新数据添加到数据源中
    dataList.Add(data);
    //绘制图形
    DrawChart();
}
  1. 在数据源更新时触发数据缓存的更新事件,并绘制实时曲线:
//数据缓存类
public class DataBuffer{
    private List<double> dataList;
    private int bufferCount;
    private Action<double> OnDataReceived;

    public DataBuffer(int count, Action<double> onDataReceived){
        dataList = new List<double>();
        bufferCount = count;
        OnDataReceived = onDataReceived;
    }

    public void Push(double value){
        if(dataList.Count >= bufferCount){
            dataList.RemoveAt(0);
        }
        dataList.Add(value);
        OnDataReceived?.Invoke(value);
    }
}

//窗口加载事件
private void Form_Load(object sender, EventArgs e){
    chart1.Series.Clear();
    chart1.Series.Add(new Series());
    chart1.Series[0].ChartType = SeriesChartType.Line;

    var buffer = new DataBuffer(10, DataReceived);
    //模拟数据获取
    Task.Run(async () => {
        while(true){
            buffer.Push(1.0);
            await Task.Delay(1000);
        }
    });
}

示例说明

示例1

在WinForm项目中,实现绘制实时CPU利用率曲线图。

  1. 创建WinForm项目。

  2. 添加Chart控件和定时器控件。

  3. 在MainForm.cs中添加如下代码:

public partial class MainForm : Form{
    private PerformanceCounter counter;
    private List<float> dataList = new List<float>();
    private Timer timer;

    public MainForm(){
        InitializeComponent();
        InitTimer();
        InitCounter();
    }

    private void InitCounter(){
        counter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
        //初始化性能计数器
        counter.NextValue();
    }

    private void InitTimer(){
        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += Timer_Tick;
        timer.Start();
    }

    private void Timer_Tick(object sender, EventArgs e){
        float cpuUsage = counter.NextValue();
        dataList.Add(cpuUsage);
        chart1.Series[0].Points.Clear();
        for (int i = 0; i < dataList.Count; i++) {
            chart1.Series[0].Points.AddY(dataList[i]);
        }
        chart1.Invalidate();
    }

    private void MainForm_Load(object sender, EventArgs e){
        chart1.Series.Clear();
        chart1.Series.Add(new Series());
        chart1.Series[0].ChartType = SeriesChartType.Line;
        chart1.ChartAreas[0].AxisY.Minimum = 0;
        chart1.ChartAreas[0].AxisY.Maximum = 100;
    }
}
  1. 运行程序,可以看到实时CPU利用率曲线图。

示例2

在WPF项目中,实现绘制实时股票价格曲线图。

  1. 创建WPF项目。

  2. 添加Chart控件和定时器控件。

  3. 在MainWindow.xaml.cs中添加如下代码:

public partial class MainWindow : Window{
    private List<double> dataList = new List<double>();
    private Timer timer;

    public MainWindow(){
        InitializeComponent();
        InitTimer();
    }

    private void InitTimer(){
        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += Timer_Tick;
        timer.Start();
    }

    private void Timer_Tick(object sender, EventArgs e){
        Random random = new Random();
        double price = random.NextDouble() * 100;
        dataList.Add(price);
        chart.Series[0].Points.Clear();
        for (int i = 0; i < dataList.Count; i++) {
            chart.Series[0].Points.AddY(dataList[i]);
        }
        chart.InvalidateVisual();
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e){
        chart.Series.Clear();
        chart.Series.Add(new Series());
        chart.Series[0].ChartType = SeriesChartType.Line;
        chart.ChartAreas[0].AxisY.Minimum = 0;
        chart.ChartAreas[0].AxisY.Maximum = 100;
    }
}
  1. 运行程序,可以看到实时股票价格曲线图。

结语

本文通过说明c#实时曲线图实现的两种方式,通过两个不同的实例代码来说明。

在使用实时曲线图的时候,需要注意数据源的更新和图形的绘制。此外,如果需要显示大量的数据,需要合理地进行数据采样和缩放,保证曲线的实时性和可读性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 实时曲线图示例代码 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • Unity实现桌面反弹的示例代码

    下面是Unity实现桌面反弹的完整攻略及示例代码。 桌面反弹的实现过程 首先,我们需要创建一个3D球体作为桌球,并且给它添加物理组件,如刚体和碰撞体,以便后面更好地实现球的反弹。 接着,我们需要创建多个3D立方体作为障碍物,并给它们添加物理组件,如刚体和碰撞体。这种障碍物的数量和形状将会对球的运动轨迹产生影响。 在程序中,我们需要创建OnCollisionE…

    C# 2023年5月15日
    00
  • C# Request.Form用法案例详解

    C# Request.Form用法案例详解 简介 Request对象是ASP.NET Web应用程序中的内置对象,用于在Web服务器上处理HTTP请求。其中,Request.Form是一个集合,用于获取HTTP POST的表单值。Request.Form的用法非常简单,可以通过指定表单控件的名称来获取该表单控件的值。 使用方法 //获取提交表单值 strin…

    C# 2023年6月1日
    00
  • c# 连接池的设置与使用

    关于c#连接池的设置与使用,我会提供以下内容: 什么是连接池 连接池是一种技术,用于维护和管理连接的缓存,自动分配和回收数据库连接对象。当应用程序请求连接资源时,连接池会检查是否有可用的连接对象,如果有就直接返回给应用程序,没有则自动创建连接对象,并将其添加到连接池中。当应用程序不再使用连接对象时,连接池会将连接对象回收并重新放回池中供下次使用。 配置连接池…

    C# 2023年5月15日
    00
  • C#实现的一款比较美观的验证码完整实例

    C#实现的一款比较美观的验证码完整实例攻略 目标 本攻略旨在通过C#语言实现一款美观的验证码,提供完整的代码实现以及使用过程中需要注意的事项。 实现步骤 创建一个Windows Form窗体应用程序。 在工具箱中选择“PictureBox”控件并添加到窗体中。 在控件属性中设置“SizeMode”为“StretchImage”。 在工具箱中选择“Button…

    C# 2023年6月6日
    00
  • Python3.10和Python3.9版本之间的差异介绍

    Python3.10和Python3.9版本之间的差异介绍 Python 3.10是Python编程语言的最新版本,它相对于Python 3.9有一些新特性和改进,下面我们来具体介绍一下它们之间的不同点。 新特性 parenthesized context managers in comprehensions 在Python 3.10中,可以在列表解析、生成…

    C# 2023年6月7日
    00
  • c#数组详解

    C#数组详解 什么是数组 数组是 C# 中最常用的一种数据结构,它可以用于存储同一种数据类型的多个元素。数组中的元素可以通过数组下标进行访问,下标从 0 开始计数。 数组定义和初始化 下面是定义和初始化一个数组的语法: 数据类型[] 数组名 = new 数据类型[数组长度]; 其中,数组类型可以为整型、字符型、浮点型、对象型(即自定义类)等。数组长度为整型数…

    C# 2023年5月31日
    00
  • C# AddRange(ICollection):将 ICollection 中的元素添加到集合中

    C#中的AddRange方法用于将一个集合的元素添加到另一个集合中。其定义如下: public void AddRange(ICollection collection) 可以看到,它接受一个ICollection类型的参数,也就是说可以接收任何实现ICollection接口的类的对象,比如List、HashSet、Queue等等。 具体使用方法如下: Li…

    C# 2023年4月19日
    00
  • 详解Java发送HTTP请求

    Java发送HTTP请求是一种常见的网络编程技术,可以用于与Web服务器进行通信。Java提供了多种方式发送HTTP请求,包括使用HttpURLConnection类、使用HttpClient库等。本文将提供详解Java发送HTTP请求的完整攻略,包括创建HttpURLConnection对象、设置请求参数、发送请求、处理响应等。同时,本文还提供两个示例,演…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部