0

我正在尝试为我的 mschart 图表制作一个缩小功能。我的想法是为图表设置一个单击方法,每次用鼠标右键单击图表时,缩放值都应该改变。因此图表应该响应并有更多值的空间。我做了 4 个缩放步骤:240 个值、3600 个值、43'200 个值、86'400 个。图表点击有条不紊如下所示:

void chart_holder_Click(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            if (counter < 3)
            {
                counter++;
            }
            else
            {
                counter = 0;
            }

            switch (counter)
            {
                default:
                    //zoomsize -> 240s | 4min
                    zoomSize = 0;
                    graphSizing = 240;
                    TempBuffer = new DataPoint[graphSizing];
                    file = new DataPoint[graphSizing];
                    TempbufferValuesTOZero();
                    FileValuesTOZero();
                    break;

                case 0:
                    //zoomsize -> 240s | 4min
                    zoomSize = 0;
                    graphSizing = 240;
                    TempBuffer = new DataPoint[graphSizing];
                    file = new DataPoint[graphSizing];
                    TempbufferValuesTOZero();
                    FileValuesTOZero();
                    break;
                case 1:
                    //zoomsize -> 3'600s | 1h
                    zoomSize = 1;
                    graphSizing = 3600;
                    TempBuffer = new DataPoint[graphSizing];
                    file = new DataPoint[graphSizing];
                    TempbufferValuesTOZero();
                    FileValuesTOZero();
                    break;

                case 2:
                    //zoomsize -> 43'200s | 12h
                    zoomSize = 2;
                    graphSizing = 43200;
                    TempBuffer = new DataPoint[graphSizing];
                    file = new DataPoint[graphSizing];
                    TempbufferValuesTOZero();
                    FileValuesTOZero();
                    break;

                case 3:
                    //zoomsize -> 86'400s | 24h
                    zoomSize = 3;
                    graphSizing = 86400;
                    TempBuffer = new DataPoint[graphSizing];
                    file = new DataPoint[graphSizing];
                    TempbufferValuesTOZero();
                    FileValuesTOZero();
                    break;
            }
        }
    }

AxisX.Maximum 使用属性定义public static int graphSizing { get; set; }。我得到的图表是实时图表,因此每秒都会添加新值等。TempbufferValuesTOZero、FileValuesTOZero 用 0/0 填充整个数组。

在我将值添加到图表之前,我用这种方法准备它们:我有一个 switch 语句,它检查 zoomSize 以了解如何准备数据

public void prepareData()
        {
            switch (zoomSize)
            {
                default:
                    prepData1();
                    break;

                case 0:
                    prepData1();
                    break;

                case 1:
                    prepData2();
                    break;

                case 2:
                    prepData3();
                    break;

                case 3:
                    prepData4();
                    break;
            }
        }

例如它是如何准备的

public void prepData1()
    {
        graphSizing = 240;
        Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

        for (double i = unixTimestamp; unixTimestamp - graphSizing < i; i--)
        {
            bool exists = true;
            DateTime x = UnixTODateTime(i);

            if (exists != (Array.Exists(file, element => element.XValue == i)))
            {
                TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(x.ToOADate(), 0) }).ToArray();
            }
            else
            {
                DataPoint point = Array.Find(file, element => element.XValue == i);
                TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(x.ToOADate(), point.YValues) }).ToArray();
            }
        }
    }

之后调用此方法以显示图表中的值:

public void fileRead()
        {
            chart_holder.Series[0].Points.Clear();

            foreach (DataPoint a in TempBuffer)
            {
                chart_holder.Series[0].Points.Add(a);
                if (a.YValues[0] == 9999)
                {
                    a.Color = Color.Red;
                }
            }
        }

TempBuffer 是一个数据点数组,我在其中存储值 ( public DataPoint[] TempBuffer = new DataPoint[graphSizing];)。

但它并不像预期的那样安静地工作。只有默认的 / 0 案例按计划完美运行。但是一旦我想缩小,它就不再起作用了。在案例 2 中,AxisX 值完全错误,并且 AxisY 值甚至没有出现。在案例 3 和 4 中,程序崩溃了。CPU使用率也很高。

知道为什么其他情况不像 default / 1 那样有效吗?以及如何提高性能并最大限度地减少高 CPU 使用率?

也为了更好地可视化图表:240个值: 在此处输入图像描述

3600 个值: 在此处输入图像描述

感谢您的帮助
问候 C.User

4

0 回答 0