Здравствуйте. Я пытаюсь обновлять свои диаграммы каждую секунду, все диаграммы должны быть всегда в одно и то же время.Для лучшего понимания я добавлю изображение, но сначала я объясню, что на самом деле происходит.
Итак, я отправляю запросы ping, каждый раз, когда есть результат, он записывает его в массив точек данных, называемый file.Все отлично, работает как положено.
В то же время работают два таймера, один из которых вызывает метод, который подготавливает данные (скажем, в определенное время в массиве нет данных -> он должен просто установить значение 0).Подготовленные данные находятся в буфере.
Второй таймер обновляет пользовательский интерфейс и читает данные из tempData, но это не совсем работает так, как ожидалось или хотелось.
Таймеры:
myTimer.Interval = 1000;
myTimer.Tick += FileReadFunction;
aTimer.Elapsed += new System.Timers.ElapsedEventHandler(prepData);
aTimer.Interval = 1000;
Нажатие кнопки, которая запускает таймеры:
private void _tbStartAll_Click(object sender, EventArgs e)
{
lock (_hosts)
{
foreach (HostPinger hp in _hosts)
hp.Start();
myTimer.Start();
aTimer.Enabled = true;
}
}
Способ подготовкиДанные в классе формы:
public void prepData(object objectInfo, EventArgs e)
{
foreach (NetPinger.source.AddGraph b in graphList)
{
b.prepareData();
}
}
Метод подготовительных данных:
public void prepareData()
{
double unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
for (double i = unixTimestamp; unixTimestamp - graphSizing < i; i--)
{
bool exists;
try
{
exists = Array.Exists(file, element => element.XValue == i);
exists = true;
}
catch
{
exists = false;
}
try
{
if (exists == false)
{
TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { new DataPoint(i, 0) }).ToArray();
}
else
{
DataPoint point = Array.Find(file, element => element.XValue == i);
TempBuffer = TempBuffer.Skip(1).Concat(new DataPoint[] { (point) }).ToArray();
}
}
catch (Exception ex)
{
//just for debugging...
}
}
}
Метод чтения файла в классе формы:
private void FileReadFunction(object objectInfo, EventArgs e)
{
foreach (NetPinger.source.AddGraph b in graphList)
{
b.fileRead();
}
}
Метод FileRead / Update Chart:
public void fileRead()
{
//double unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
chart_holder.Series[0].Points.Clear();
foreach (DataPoint a in TempBuffer)
{
chart_holder.Series[0].Points.Add(a);
}
}
Изображение Пример того, что я имею в виду с синхронизацией времени:
У меня нет идей, почему не получается, потому что поток быстрее другого?Или в чем причина и как я могу это исправить?Я очень благодарен за вашу помощь.
Привет C.User