На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Обновление графиков на вкладке и запись данных через заданный период , NET 4, charts
    Приложение Windows Forms, Windows 10. В программе на вкладках соответственно задаются параметры, выводятся графики и измеренные (эмулируются) значения. При времени опроса каналов от 1 секунды и более данные сбрасываются через 5 минут, а при дробных значениях - данные вообще не сбрасываются. При времени опроса 0,1 секунда 3 графика выводятся синхронно, а при 0,01 секунде двигается только первый график, а 2 других замирают. Обновление графиков происходит только при переключении вкладок. Подскажите, пожалуйста, как исправить программу, чтобы:
    - данные сбрасывались через заданный промежуток времени при долях секунды;
    - графики на вкладке изменялись бы синхронно при 0,01 секунде.
    Проект прикрепил.
    Прикреплённый файлПрикреплённый файлcsFormsTest.zip (15,35 Кбайт, скачиваний: 23)
      Не на 100% уверен, что правильно понял, но:

      Для решения проблемы с сбросом данных при долях секунды и синхронного обновления графиков при времени опроса 0,01 секунды в приложении на C# с использованием Windows Forms, можно воспользоваться следующими подходами:

      Для сброса данных при долях секунды можно использовать таймер, который будет запускаться каждый раз при определенном промежутке времени (например, 5 минут), и сбрасывать данные на вкладках. Для этого можно использовать класс System.Windows.Forms.Timer. Ниже приведен пример кода, который сбрасывает данные на вкладках каждые 5 минут:

      ExpandedWrap disabled
        private Timer dataResetTimer;
         
        public Form1()
        {
            InitializeComponent();
         
            // Инициализация таймера
            dataResetTimer = new Timer();
            dataResetTimer.Interval = 300000; // 5 минут в миллисекундах
            dataResetTimer.Tick += DataResetTimer_Tick;
            dataResetTimer.Start();
        }
         
        private void DataResetTimer_Tick(object sender, EventArgs e)
        {
            // Сброс данных на вкладках
            // Здесь можно добавить код для сброса данных на ваших вкладках
        }

      Для синхронного обновления графиков при времени опроса 0,01 секунды можно использовать многопоточность. Можно создать отдельный поток для каждого графика и обновлять их данные в параллель. Для этого можно использовать класс System.Threading.Thread. Ниже приведен пример кода, который создает три потока для трех графиков и обновляет их данные в параллель:

      ExpandedWrap disabled
        private Thread graphThread1;
        private Thread graphThread2;
        private Thread graphThread3;
         
        public Form1()
        {
            InitializeComponent();
         
            // Инициализация потоков для графиков
            graphThread1 = new Thread(UpdateGraph1);
            graphThread1.Start();
         
            graphThread2 = new Thread(UpdateGraph2);
            graphThread2.Start();
         
            graphThread3 = new Thread(UpdateGraph3);
            graphThread3.Start();
        }
         
        private void UpdateGraph1()
        {
            while (true)
            {
                // Обновление данных графика 1
                // Здесь можно добавить код для обновления данных на вашем графике 1
         
                Thread.Sleep(10); // Задержка 10 миллисекунд
            }
        }
         
        private void UpdateGraph2()
        {
            while (true)
            {
                // Обновление данных графика 2
                // Здесь можно добавить код для обновления данных на вашем графике 2
         
                Thread.Sleep(10); // Задержка 10 миллисекунд
            }
        }
         
        private void UpdateGraph3()
        {
            while (true)
            {
                // Обновление данных графика 3
                // Здесь можно добавить код для обновления данных на вашем гра
            Thread.Sleep(10); // Задержка 10 миллисекунд
        }
        }

      Обратите внимание, что в примере используется `Thread.Sleep(10)` для создания задержки в 10 миллисекунд между обновлениями данных на графиках. Вы можете настроить это значение в соответствии с вашими требованиями и производительностью вашей системы.

      Также не забудьте обновлять графики на форме из соответствующих потоков с помощью метода `Control.Invoke` или `Control.BeginInvoke`, так как обновление графиков должно происходить в главном потоке (потоке пользовательского интерфейса) при использовании Windows Forms. Ниже приведен пример кода, который обновляет график на форме из потока:

      ExpandedWrap disabled
        private void UpdateGraph1()
        {
            while (true)
            {
                // Обновление данных графика 1
                // Здесь можно добавить код для обновления данных на вашем графике 1
         
                // Обновление графика на форме в главном потоке
                this.Invoke((MethodInvoker)delegate {
                    // Здесь можно добавить код для обновления графика на форме
                });
         
                Thread.Sleep(10); // Задержка 10 миллисекунд
            }
        }

      Аналогично можно обновлять графики на остальных вкладках из соответствующих потоков.

      Надеюсь, это поможет вам исправить вашу программу и достичь требуемого поведения сброса данных и обновления графиков в вашем приложении на C# с использованием Windows Forms.
      Сообщение отредактировано: MaIron -
        Спасибо большое за желание помочь! В программе я использую backgroundWorker и мне хотелось бы найти решение при его применении, чтобы не переделывать программу. Например, как-то подправить функцию backgroundWorker1_ProgressChanged, чтобы и при 0,01 обновление шло нормально. Мне не очень понятно, почему при использовании backgroundWorker при 0,1 графики обновляются нормально, а при 0,01 - нет. В программе количество графиков задается пользователем путем ввода нужного количества названий графиков в файле "Названия графиков.txt", количество графиков может быть от 1 до 6. Ваше решение периодичности сброса данных попробую, надеюсь поможет. Надеюсь на Вашу помощь в исправлении программы.
          Я попробовал предложенный Вами способ сброса данных - не получилось. Может быть я неправильно его использую? Прикрепил проект со сбросом по таймеру. Пока я не нашел также решение задачи синхронного обновления всех графиков.
          Прикреплённый файлПрикреплённый файлcsFormsTest.zip (15,05 Кбайт, скачиваний: 24)
            Подход боюсь немного не правильный. У Вас данные генерятся непосредственно в потоке отображения, поэтому и тестовый пример получился неадекватным. Данные напряжений скорее всего будут приходить от какого либо устройства, либо по таймингу с самого устройства, либо по запросу вашей программы. В первом случае проще, потому как по приходу данных будет калбек, ну скажем от COM порта и по нему вы будете передавать данные для отображения пользователю, во втором случае надо будет создать поток (именно поток а не бекграунд воркер) чтобы из него дергать устройство на отдачу данных. И последнее, накопительный график в Вашем случае это зло, ибо думаю что данные вы будете наблюдать не минуту и не 2, а чарт имеет свойство при больших данных дико тормозить и лагать, поэтому лучше сделать скользящий буфер для отображения графика точек на 500.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,1387 ]   [ 20 queries used ]   [ Generated: 27.04.24, 11:02 GMT ]