首页 > 解决方案 > 向 DataPoint 添加太多点

问题描述

我正在创建 AddGraph 类和主机的对象。在我的 PingForm 类中,使用 AddNewHost(...) 这样的方法

public void AddNewHost(HostPinger host)
{
    HostOptions dlg = new HostOptions();
    if (dlg.ShowDialog(this, host) == DialogResult.OK)
    {
        bool exists = false;
        lock (_hosts)
        {
            foreach (HostPinger hp in _hosts)
            {
                if (hp.HostIP != null && hp.HostIP == dlg.Host.HostIP)
                {
                    exists = true;
                    break;
                }
            }

            hostListPanels.Add(Convert.ToString(dlg.Host.HostIP));                   


            source.AddGraph newGraph = new source.AddGraph();
            graphList.Add(newGraph);

            var createdPanel = newGraph.panelAdd(tableLayoutPanel1, Convert.ToString(dlg.Host.HostIP), hScrollBar1);

        }

        dlg.Host.Logger = DefaultLogger.Instance;
        dlg.Host.OnPing += new OnPingDelegate(OnHostPing);
        dlg.Host.OnStopPinging += new OnHostPingerCommandDelegate(hp_OnStopPinging);
        dlg.Host.OnStartPinging += new OnHostPingerCommandDelegate(hp_OnStartPinging);


        ...          
    }
}

在每次 Ping 之后,在 PingForm 类中调用另一个方法,无效 OnHostPing()。现在在 OnHostPing() 中我调用 PlotData(),这个方法也在 PingForm 中。

public void PlotData(Chart chart)
{
    unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
    double rvalue = R.Next(0, 20);

    if (InvokeRequired)
    {
        Invoke(new NetPinger.source.AddGraph.ReturnChartDelegate(PlotData), new Object[] { chart });
    }
    else
    {
        int i = 0;
        if (graphList[i].Name != chart.Name)
        {
            for (int x = 0; graphList[x].Name != chart.Name; x++)
            {
                i = x;
            }
            graphList[i].dataBuffer(unixTimestamp, rvalue);
        }
        else
        {
            graphList[i].dataBuffer(unixTimestamp, rvalue);
        }                          
    }
}

在我创建了多个主机之后,每个主机都有自己的面板,里面有一个图表。每个图表都在填充他自己的值,这是有效的。但是,如果我尝试单独填充每个 AddGraph 对象的缓冲区,它就不起作用,所有对象的时间戳和值一起写入所有缓冲区。所以假设我在缓冲区中有 host1: 19991 / 10, host2: 1999 / 12 的时间戳/值,host1 和 host2 的值都会有,但我希望每个 AddGraph 对象都有自己的缓冲区。缓冲区如下所示,位于 AddGraph 类中:

public void dataBuffer(double unixTimestamp, double roundTripTime)
{
    if(counter != graphDataPoints.Length)
    {

            graphDataPoints[counter] = new DataPoint(unixTimestamp, roundTripTime);
            counter++;

    }
    else
    {
        MessageBox.Show("buffer full.");
    }
}  

这就是运行一些 ping 后缓冲区内的数据的样子。 缓冲

但正如在 UI 中看到的,每个图表都有自己的数据添加到图表中,而不是像缓冲区一样。我正在使用chart.Series[0].Points.AddXY(unixTimestamp, rvalue);plotdata 方法将数据添加到图表中。

桂

我希望以某种方式可以理解我的问题是什么以及我想要实现的目标。感谢帮助!

标签: c#winformsclassbuffermschart

解决方案


推荐阅读