【问题标题】:Graph dynamic update图动态更新
【发布时间】:2013-04-22 07:06:02
【问题描述】:

我有一个应用程序,每次温度变化时都会从串行端口获取温度数据。该值存储在变量中并显示在文本框中。 我想在图表中显示温度与时间的关系。 我已将图表设置如下,但我不知道从哪里开始更新温度线与每秒时间的关系。

 InitializeComponent();
        //Chart
        chart1.ChartAreas.Add("areas");
        chart1.ChartAreas["areas"].AxisX.Minimum = 0;
        chart1.ChartAreas["areas"].AxisX.Interval = 1;
        chart1.ChartAreas["areas"].AxisY.Minimum = 0;
        chart1.ChartAreas["areas"].AxisY.Maximum = 250;
        chart1.ChartAreas["areas"].AxisY.Interval = 10;
        chart1.ChartAreas["areas"].AxisX.Title = "Time [s]";
        chart1.ChartAreas["areas"].AxisY.Title = "Temperature [°C]";
        chart1.Series.Add("Temperature");
        chart1.Series["Temperature"].Color = Color.Red;
        chart1.Series["Temperature"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
        chart1.Titles.Add("Extruder Temperature");

       //this two lines are only to see something in the graph
        chart1.Series["Temperature"].Points.AddXY(0, 20);
        chart1.Series["Temperature"].Points.AddXY(1, 50);
    }

我认为我需要通过用变量替换值来更新“点”和“值”(0, 20),但如果这样做,我在图中只有一个点,我无法显示前一个价值观。 作为初学者,我将不胜感激。

【问题讨论】:

  • 您使用的是 Windows 窗体还是 WPF?
  • @jle 我正在使用 windows 窗体

标签: c#


【解决方案1】:

另一种方法(每秒刷新一次)是使用 BackgroundWorker。这个问题给出了example。本质上,您启动了一个后台线程,该线程每隔设定的时间更新视图。

private BackgroundWorker _bw;

....
    InitializeComponent();
    _bw = new BackgroundWorker
    {
      WorkerReportsProgress = true,
      WorkerSupportsCancellation = true
    };
    _bw.DoWork += bw_DoWork;
    _bw.ProgressChanged += bw_ProgressChanged;
    _bw.RunWorkerCompleted += bw_RunWorkerCompleted;

    _bw.RunWorkerAsync ("Hello to worker");
     if (_bw.IsBusy) _bw.CancelAsync();
  }

  private void bw_DoWork (object sender, DoWorkEventArgs e)
  {

      if (_bw.CancellationPending) { e.Cancel = true; return; }
      var dataPoints = YourConnectToSerialPortAndGetDataFunction();
      _bw.ReportProgress (dataPoints);
      Thread.Sleep (1000); 

    e.Result = dataPoints;    // This gets passed to RunWorkerCompleted
  }

  private void bw_RunWorkerCompleted (object sender,
                                     RunWorkerCompletedEventArgs e)
  {

}

  private void bw_ProgressChanged (object sender,
                                  ProgressChangedEventArgs e)
  {
//UPDATE YOUR LABEL
chart1.Series["Temperature"].Points.AddXY(0, 20);
        chart1.Series["Temperature"].Points.AddXY(1, 50);
  }

【讨论】:

    【解决方案2】:

    获取新数据后,只需添加另一个数据点: 只是给你一个想法(因为你还没有发布你的数据接收方法):

    OnSerialReceive()
    {
        var temp = serialport.read();
        var time = (int)stopwatch.Elapsed.TotalSeconds;
        chart1.Series["Temperature"].Points.AddXY(time, temp);
    }
    

    是的,一旦您将真实数据输入图表,您就会想要删除虚假数据。虚假数据令人困惑。

    【讨论】:

    • 我认为他还需要删除第一个 Datapoint 以便图形不会 ZoomOut 并且看起来就像在 Windows 任务管理器中看到的用于 RAM 使用的运行图形..跨度>
    • 感谢您的回答。我按照你建议的方向走。
    猜你喜欢
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2022-11-11
    • 2022-01-25
    • 2021-12-09
    • 2014-08-10
    相关资源
    最近更新 更多