Я создаю объекты класса 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.");
}
}
Вот так выглядят данные внутри буфера после выполнения некоторых пингов.
Но, как видно из пользовательского интерфейса, каждый график имеет свои собственные данные, добавленные на график, а не оба, как в буфере. Я добавляю данные на график с помощью chart.Series[0].Points.AddXY(unixTimestamp, rvalue);
в методе plotdata.
Надеюсь, понятно, в чем моя проблема и чего я пытаюсь достичь. Спасибо за помощь!