Добавление слишком большого количества точек в DataPoint - PullRequest
0 голосов
/ 02 мая 2018

Я создаю объекты класса 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.");
    }
}  

Вот так выглядят данные внутри буфера после выполнения некоторых пингов. Buffer

Но, как видно из пользовательского интерфейса, каждый график имеет свои собственные данные, добавленные на график, а не оба, как в буфере. Я добавляю данные на график с помощью chart.Series[0].Points.AddXY(unixTimestamp, rvalue); в методе plotdata.

gui

Надеюсь, понятно, в чем моя проблема и чего я пытаюсь достичь. Спасибо за помощь!

...