下面是详细的“c# 实时曲线图示例代码”攻略。
简介
实时曲线图常用于数据采集与监控领域,其实现方法主要通过定时器事件或者数据缓存方式进行数据刷新。在c#中可以使用WPF或WinForm两种方式实现绘制实时曲线。
在实现实时曲线之前,我们需要掌握以下知识点:
- 定时器
- 数据缓存
- 绘制曲线
实现方法
使用定时器实现
-
创建WinForm或WPF项目,并添加图表控件。
-
添加定时器控件,并设置定时器的时间间隔。
-
在代码中定义数据源和定时器事件:
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();
}
- 将数据源绑定到图形控件,并绘制出来:
private void Form_Load(object sender, EventArgs e)
{
chart1.Series.Clear();
chart1.Series.Add(new Series());
chart1.Series[0].ChartType = SeriesChartType.Line;
}
使用数据缓存实现
-
创建WinForm或WPF项目,并添加图表控件。
-
在代码中定义数据源和绘制事件:
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();
}
- 在数据源更新时触发数据缓存的更新事件,并绘制实时曲线:
//数据缓存类
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利用率曲线图。
-
创建WinForm项目。
-
添加Chart控件和定时器控件。
-
在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;
}
}
- 运行程序,可以看到实时CPU利用率曲线图。
示例2
在WPF项目中,实现绘制实时股票价格曲线图。
-
创建WPF项目。
-
添加Chart控件和定时器控件。
-
在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;
}
}
- 运行程序,可以看到实时股票价格曲线图。
结语
本文通过说明c#实时曲线图实现的两种方式,通过两个不同的实例代码来说明。
在使用实时曲线图的时候,需要注意数据源的更新和图形的绘制。此外,如果需要显示大量的数据,需要合理地进行数据采样和缩放,保证曲线的实时性和可读性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# 实时曲线图示例代码 - Python技术站