c#实时更新图表

本文关键字:实时更新 | 更新日期: 2023-09-27 17:53:16

这里我有一个图表(graph1),通常应该每隔1秒添加一个随机点。但它没有……我试着找出问题是什么,但在这里我没有任何想法……计时器启动,label1每秒钟改变一次,但图表没有改变…当我点击按钮1时,它会添加一个新的点。我错过了什么?请帮助……非常感谢。

namespace Test_Chart1
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        graph1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
        graph1.ChartAreas[0].AxisX.IsLabelAutoFit = true;
        graph1.ChartAreas[0].AxisX.ScaleView.Size = 40;
        System.Timers.Timer _Timer1s = new System.Timers.Timer(1000);   //object
        _Timer1s.Elapsed += _Timer1sElapsed;                            //event in object
        _Timer1s.Start();                                               //start counting            
    }
    private void _Timer1sElapsed(object sender, EventArgs e)//Timer each 100ms
    {        
        if (label1.BackColor == Color.Red)
        {
            label1.BackColor = Color.Blue;
            PutValueInGraph1();              
        }
        else label1.BackColor = Color.Red;             
    }
    private void button1_Click(object sender, EventArgs e)
    {
        PutValueInGraph1();
    }
    private void PutValueInGraph1()
    {
        graph1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
        graph1.ChartAreas[0].AxisX.IsLabelAutoFit = true;
        graph1.ChartAreas[0].AxisX.ScaleView.Size = 100;
        Random Rand_Value = new Random();
        int ValueToAdd = Rand_Value.Next(1, 100);
        listBox1.Items.Add(ValueToAdd.ToString());
        graph1.Series["Data1"].Points.AddY(ValueToAdd);
        if (graph1.ChartAreas[0].AxisX.Maximum-10 > graph1.ChartAreas[0].AxisX.ScaleView.Size)
        {
               graph1.ChartAreas[0].AxisX.ScaleView.Scroll(graph1.ChartAreas[0].AxisX.Maximum);
            graph1.Series["Data1"].Points.RemoveAt(0);
        }
    }
}
}

好的,这是新的:

public partial class Form1 : Form
{
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
    public Form1()
    {
        InitializeComponent();
        myTimer.Tick += new EventHandler(TimerEventProcessor);
        myTimer.Interval = 1;           
    }
    private void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
    {
        Random Rand_Value = new Random();
        int ValueToAdd = Rand_Value.Next(1, 100);
        listBox1.Items.Add(ValueToAdd.ToString());
        graph1.Series["Data1"].Points.AddY(ValueToAdd);
        if (graph1.ChartAreas[0].AxisX.Maximum - 10 > graph1.ChartAreas[0].AxisX.ScaleView.Size)
        {
            graph1.ChartAreas[0].AxisX.ScaleView.Scroll(graph1.ChartAreas[0].AxisX.Maximum);
            graph1.Series["Data1"].Points.RemoveAt(0);
        }
    }
    private void btn_Start_Click_1(object sender, EventArgs e)
    {
        graph1.ChartAreas[0].AxisX.ScrollBar.Enabled = true;
        graph1.ChartAreas[0].AxisX.IsLabelAutoFit = true;
        graph1.ChartAreas[0].AxisX.ScaleView.Size = 100;
        myTimer.Start();
        BlinkLed.BackColor = Color.YellowGreen;
    } 
  private void btn_Stop_Click(object sender, EventArgs e)
    {
        myTimer.Stop();
        BlinkLed.BackColor = Color.AliceBlue;
    }   
}  

你认为这样更好吗?那改变线程呢?

如果我有一个按钮:

   private void PutValueInGraph1()
    {
        Random Rand_Value = new Random();
        int ValueToAdd = Rand_Value.Next(1, 100);
        listBox1.Items.Add(ValueToAdd.ToString());
        graph1.Series["Data1"].Points.AddY(ValueToAdd);
        if (graph1.ChartAreas[0].AxisX.Maximum-10 > graph1.ChartAreas[0].AxisX.ScaleView.Size)
        {
            graph1.ChartAreas[0].AxisX.ScaleView.Scroll(graph1.ChartAreas[0].AxisX.Maximum);
            graph1.Series["Data1"].Points.RemoveAt(0);
        }
    }
    private void button1_Click(object sender, EventArgs e)
    {//try to raise exception
        PutValueInGraph1();
    }

,我像这样改变事件:

   private void TimerEventProcessor(Object myObject, EventArgs myEventArgs)
    {//try to raise exception
        PutValueInGraph1();
    }

数据输入加速当我启动定时器,我一直点击按钮1。

为什么没有tom_imk所说的例外??因为我们可以同时访问同一个函数....?

谢谢你的回答

c#实时更新图表

我尝试了下面的示例代码,它对我来说工作得很好。

    public Form7()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        chart1.ChartAreas[0].AxisX.Maximum = 100;
        chart1.ChartAreas[0].AxisX.Minimum = 0;
        chart1.ChartAreas[0].AxisX.Interval = 1;
        timer1.Start();           
    }
    private void timer1_Tick(object sender, EventArgs e)
    {  
        Random Rand_Value = new Random();
        int ValueToAdd = Rand_Value.Next(1, 100);
        chart1.Series[0].Points.AddY(ValueToAdd);
    }

我很惊讶你没有得到一个异常。你在UI线程之外操作UI元素,这是你绝对不能做的。

参照本题答案:如何从c#中的另一个线程更新GUI ?

编辑:为了弄清楚为什么timerelapsed方法不在UI线程上运行:这里使用的只是错误的类。因此,简单的解决方案是不要在表单构造函数中创建System.Timers.Timer,而是在表单设计器中在表单上放置一个计时器并使用它。sowjanya attaluri的答案应标记为正确答案