astrosarah Ответов: 1

Как делать разные вещи синхронно с помощью таймера на 10 мс?


Теперь мне нужно сделать 3 вещи.
1. записывал эти данные в текстовый файл каждые 10 мс.
2. связь получите данные и покажите дальше
ListView
по RS485 каждые 10 мс .
3. Нанесите данные на мой график.
mschart
в реальном времени на 10 мс.
Я использовал
[DllImport("winmm.dll")]
чтобы получить точность 10 мс.
И я использовал 3 потока для выполнения вышеуказанных заданий.
Но теперь я нашел данные текстового файла не всегда 10 мс,иногда 20 мс.
Так как же я мог бы программировать свой код, если бы хотел, чтобы все задания выполнялись синхронно в каждые 10 мс?
Спасибо!

Что я уже пробовал:

<pre><pre> <pre>
mTimer1 = new TimePeriod();
threadWrite = new Thread(() =>
{
         mTimer1.AccurateTimer(this, new Action(WritetoTextFile), delay);
});
thread1.IsBackground = true;
thread1.Start();

mTimer2 = new TimePeriod();
thread2 = new Thread(() =>
{
   mTimer2.AccurateTimer(this, new Action(tmrChart_Tick), delay);
});
thread2.IsBackground = true;
thread2.Start();

mTimer3 = new TimePeriod();
threadDisplay = new Thread(() =>
{
      mTimer3.AccurateTimer(this, new Action(DisplayData), delay);
});
thread3.IsBackground = true;
thread3.Start();

F-ES Sitecore

Я думаю, что вам будет трудно сделать это с помощью c#.

Maciej Los

Похоже, вам не нужны 3 таймера. Вам нужно только одно и 3 действия в нем: 1) дамп данных, 2) чтение данных, 3) построение графика на графике.

johannesnestler

Запись в текстовый файл за 10 мс - это не сработает. Сделайте его потребительским производителем-шаблоном и оставьте таймеры в стороне. Сделайте это как можно быстрее. Диаграммы "реального времени" - это не тривиальная тема...

Ralf Meier

На мой взгляд, это не будет работать на 100% надежно в каждый момент времени.
Если вы работаете с таймерами или задачами - если методу требуется более 10 мс для завершения своей работы, вы не можете гарантировать это время цикла-некоторые действия не будут выполняться одновременно (например, запись данных в один и тот же файл).

1 Ответов

Рейтинг:
2

OriginalGriff

Таймеры ненадежны в том смысле, в каком вы думаете: когда вы указываете интервал, вы не получите обработчик событий Тика, вызванный именно на этом интервале - вы получите событие, которое не будет выполнено меньше указанного интервала, но в Windows нет ничего, что заставило бы его выполнить в это время - и, что еще хуже, нет реального способа предсказать, когда именно обработчик Тика будет выполнен, потому что это зависит от количества ядер в системе, теперь нужно обслуживать много потоков и что еще делает система.

А выполнение действий на основе файлов с небольшим интервалом в любом случае будет чревато задержками, потому что существует только один головной диск для записи всех выходных запросов от всех приложений и компонентов ОС, которые записывают на этот диск. Да, здесь есть кэши, но обычно они довольно малы и быстро заполняются - добавляя еще больше задержек как к обработке таймера, так и к действиям записи.

Хуже того, увеличение числа параллельных потоков не обязательно помогает, это может сделать его еще хуже, потому что каждый поток нуждается в доступном ядре для выполнения, и если общее количество потоков во всей системе превышает количество ядер, некоторым придется ждать. Добавьте больше нитей, и больше придется ждать. Поскольку настройка потока, переключение и планирование также занимают основное время, добавление потока может фактически замедлить пропускную способность!