C # WinForms Попытка синхронизировать временную шкалу - PullRequest
0 голосов
/ 29 мая 2018

Здравствуйте. Я пытаюсь обновлять свои диаграммы каждую секунду, все диаграммы должны быть всегда в одно и то же время.Для лучшего понимания я добавлю изображение, но сначала я объясню, что на самом деле происходит.

Итак, я отправляю запросы 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);
            }
}

Изображение Пример того, что я имею в виду с синхронизацией времени: enter image description here

У меня нет идей, почему не получается, потому что поток быстрее другого?Или в чем причина и как я могу это исправить?Я очень благодарен за вашу помощь.

Привет C.User

1 Ответ

0 голосов
/ 13 июня 2018

Я решил проблему, немного изменив код.Для обеспечения синхронизации я сначала подготавливаю данные, прежде чем их отображать.После того, как данные подготовлены, отображаются все данные.Также я сейчас использую только один таймер вместо двух.

...