向DataPoint添加太多Points

时间:2018-05-02 14:33:14

标签: c# winforms class buffer mschart

我正在创建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类中调用另一个方法,void 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之后缓冲区内的数据。 Buffer

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

gui

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

0 个答案:

没有答案