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日

相关文章

  • C#实现加密的几种方法介绍

    C#实现加密的几种方法介绍 在C#中实现加密的方法有很多,本文将介绍其中的几种常用方法。 1. 对称加密算法 对称加密算法是指加密和解密使用同一密钥的加密算法。常用的对称加密算法有DES、3DES、AES等。 1.1 DES加密算法 using System.Security.Cryptography; using System.Text; public s…

    C# 2023年6月6日
    00
  • asp.net(c#) ubb处理类

    下面我将为你详细讲解如何使用ASP.NET(C#) UBB处理类来处理UBB代码。具体步骤如下: 1.概述 UBB是一个简单的标记语言,用于在文本中添加样式和链接。ASP.NET(C#) UBB处理类可以帮助我们将UBB代码转换为HTML代码,方便展示在网页上。 2.安装UBB处理类 首先需要在ASP.NET(C#)项目中安装UBB处理类库。可以通过 NuG…

    C# 2023年6月3日
    00
  • .NET Core中反解ObjectId

    .NET Core中反解ObjectId攻略 在使用MongoDB存储数据的过程中,我们会经常使用ObjectId这个类型来作为MongoDB中的文档唯一标识符。在有些情况下,我们需要在Web API或其它程序中使用ObjectId,但是对象和字符串之间的转换可能会让人感到困惑。在.NET Core中,我们可以使用MongoDB.Bson.ObjectId类…

    C# 2023年6月3日
    00
  • js操作数据库实现注册和登陆的简单实例

    下面是关于“js操作数据库实现注册和登陆的简单实例”的完整攻略。 1. 准备工作 在开始操作数据库实现注册和登陆之前,需要进行以下准备工作: 安装 Node.js 以及相应的依赖模块。可以通过 npm 来安装依赖,具体的依赖包括 mysql、express、body-parser 等。这里以 mysql 和 express 为例进行说明,安装命令如下: ba…

    C# 2023年5月31日
    00
  • C#实现Ruby的负数索引器

    让我来详细讲解如何使用 C# 实现 Ruby 的负数索引器。 什么是 Ruby 的负数索引器 在 Ruby 中,我们可以使用负数索引器来从结尾开始访问数组元素。例如,一个包含 4 个元素的数组 arr,它们的索引分别为 0、1、2、3。如果我们想要访问最后一个元素,我们可以使用索引 -1,即 arr[-1]。类似的,如果我们想要访问倒数第二个元素,我们可以使…

    C# 2023年6月8日
    00
  • C#常用字符串加密解密方法封装代码

    非常感谢您对C#常用字符串加密解密方法封装代码的关注。下面为您详细介绍如何实现该功能。 1. 基本概念 在介绍具体的代码实现之前,首先需要了解一些基本概念。 1.1 加密和解密 加密是指将原始的明文数据通过一定的算法转换为密文,以达到防止信息泄露的目的;而解密则是指将密文数据还原回原始的明文数据。 1.2 对称加密和非对称加密 对称加密是指加密和解密使用同一…

    C# 2023年6月7日
    00
  • C#实现HTTP协议迷你服务器(两种方法)

    下面是详细讲解“C#实现HTTP协议迷你服务器(两种方法)”的完整攻略。 一、前言 随着互联网的迅猛发展,Web开发日趋成熟,HTTP协议成为Web开发中不可或缺的一部分。而服务器是Web开发的基础,因此实现一个迷你服务器对学习Web开发有着很大的帮助。本文将通过两种方法实现C#迷你HTTP服务器的搭建。 二、实现方法 方法一:使用TcpListener实现…

    C# 2023年6月7日
    00
  • .Net Core读取文件时中文乱码问题的解决方法分享

    .NET Core读取文件时中文乱码问题的解决方法分享 在使用.NET Core读取含有中文字符的文件时,有时会出现中文字符乱码的问题。这是因为在不同的编码方式下,中文字符会以不同的方式表示。本文将详细介绍读取文件时中文乱码问题的解决方法,并提供两个示例。 问题分析 先来看一个示例: string contents = System.IO.File.Read…

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