C#刷新chart控件方法及task的启停功能记录

博客探讨了在Windows Forms应用中使用Chart控件实时显示力传感器数据的方法,包括初始化曲线、数据绑定和刷新策略。作者比较了Timer和Task两种刷新方式,发现Task在高频率刷新时能避免界面卡顿,推荐使用Task进行数据更新。

首先进行Chart控件的初始化,以我记录力传感器的为例

#region  曲线初始化        
 public void IntiCHure()
        {            this.chart1.ChartAreas.Clear();
            ChartArea chartArea1 = new ChartArea("C1");
            chartArea1.BackColor = System.Drawing.SystemColors.Control;            
            this.chart1.ChartAreas.Add(chartArea1);            //定义存储和显示点的容器            
            this.chart1.Series.Clear();
            Series series1 = new Series("s1");
            Series series2 = new Series("s2");
            Series series3 = new Series("s3");
            Series series4 = new Series("s4");
            Series series5 = new Series("s5");
            Series series6 = new Series("s6");
            series1.ChartArea = "C1";
            series2.ChartArea = "C1";
            series3.ChartArea = "C1";            
            this.chart1.Series.Add(series1);            
            this.chart1.Series.Add(series2);            
            this.chart1.Series.Add(series3);            
            this.chart1.Series.Add(series4);            
            this.chart1.Series.Add(series5);            
            this.chart1.Series.Add(series6);            //设置图表显示样式            
            this.chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;            
            this.chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;            //设置标题            
            this.chart1.Titles.Clear();            
            this.chart1.Titles.Add("S01");            
            this.chart1.Titles[0].Text = "力值显示";            
            this.chart1.Titles[0].Alignment = System.Drawing.ContentAlignment.MiddleLeft;            
            this.chart1.Titles[0].ForeColor = Color.RoyalBlue;            
            this.chart1.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);            
            this.chart1.Series[0].ChartType = SeriesChartType.Line;            
            this.chart1.Series[1].ChartType = SeriesChartType.Line;            
            this.chart1.Series[2].ChartType = SeriesChartType.Line;            
            this.chart1.Series[3].ChartType = SeriesChartType.Line;            
            this.chart1.Series[4].ChartType = SeriesChartType.Line;            
            this.chart1.Series[5].ChartType = SeriesChartType.Line;            //设置图表显示样式            
            this.chart1.Series[0].Color = Color.Orange;            
            this.chart1.Series[1].Color = Color.Green;            
            this.chart1.Series[2].Color = Color.Red;            
            this.chart1.Series[3].Color = Color.Blue;            
            this.chart1.Series[4].Color = Color.DarkViolet;            
            this.chart1.Series[5].Color = Color.Brown;            
            //this.chart1.ChartAreas[0].AxisY.Title = "力值";            
            this.chart1.ChartAreas[0].AxisY.IsStartedFromZero = false;           
             this.chart1.Series[0].Points.Clear();
        }        
#endregion

初始化后再进行数据的绑定

 public void ForceDataShow(Queue<Double> Force, string RD, int index, CheckBox Cbx)
        {
            if (Force.Count > CountNum)//当组中的数据大于曲线的长度时,剔除最前面一个值                
            {
                for (int i = 0; i < num; i++)//Num为组一次更新的点数                    
                {
                    Force.Dequeue();
                }
            }
            for (int i = 0; i < num; i++)
            {
                Force.Enqueue(Convert.ToDouble(RD));//下图为增加点数到组的最后面一个值                
            }
            if (Cbx.Checked == true)
            {
                this.BeginInvoke(new MethodInvoker(() =>
                {                        //this.chart1.Series[index].Points.Clear();                        
                                         //for (int J = 0; J < Force.Count; J++)                        
                                         //{                        
                                         //    this.chart1.Series[index].Points.AddXY(TE.ElementAt(J).ToString("0.00"), Force.ElementAt(J));                        
                                         //}                        this.chart1.Series[index].Points.DataBindY(Force);  //绑定值到对应曲线中                    
                }));

            }
        }

然后是刷新的方法,尝试过Timer和Task两种刷新方法,发现用Timer的刷新频率过高时会出现界面卡顿的现象,而Task不会出现卡顿问题;

 private void timer1_Tick(object sender, EventArgs e)
        {
            if (Interlocked.Exchange(ref inTimer, 1) == 0)
            {
                ForceList = DisposeForce(RobotData.RobotValue.Value.ToString());
                ForceDataShow(ForceXData, ForceList[0], 0, cbx_Fx);
                ForceDataShow(ForceYData, ForceList[1], 1, cbx_Fy);
                ForceDataShow(ForceZData, ForceList[2], 2, cbx_Fz);
                Interlocked.Exchange(ref inTimer, 0);
            }

        }

推荐使用Task

   private void MainForm1_Load(object sender, EventArgs e)
        {
            task2 = new System.Threading.Tasks.Task(async () =>
            {
                while (true)
                {
                    if (token.IsCancellationRequested)
                    {
                        return;
                    }                    // 初始化为true时执行WaitOne不阻塞                    
                    resetEvent.WaitOne();
                    ForceList = DisposeForce(RobotData.RobotValue.Value.ToString());
                    ForceDataShow(ForceXData, ForceList[0], 0, cbx_Fx);
                    ForceDataShow(ForceYData, ForceList[1], 1, cbx_Fy);
                    ForceDataShow(ForceZData, ForceList[2], 2, cbx_Fz);
                    Interlocked.Exchange(ref inTimer, 0); 
                    await System.Threading.Tasks.Task.Delay(10);
                }

            });
        }

Task的启停操作:https://www.cnblogs.com/zhengzc/p/10724839.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值