
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.239.148.127] |
![]() |
|
![]() |
|
|
Приложение Windows Forms, Windows 10. В программе на вкладках соответственно задаются параметры, выводятся графики и измеренные (эмулируются) значения. При времени опроса каналов от 1 секунды и более данные сбрасываются через 5 минут, а при дробных значениях - данные вообще не сбрасываются. При времени опроса 0,1 секунда 3 графика выводятся синхронно, а при 0,01 секунде двигается только первый график, а 2 других замирают. Обновление графиков происходит только при переключении вкладок. Подскажите, пожалуйста, как исправить программу, чтобы:
- данные сбрасывались через заданный промежуток времени при долях секунды; - графики на вкладке изменялись бы синхронно при 0,01 секунде. Проект прикрепил. Прикреплённый файл ![]() |
Сообщ.
#2
,
|
|
|
Не на 100% уверен, что правильно понял, но:
Для решения проблемы с сбросом данных при долях секунды и синхронного обновления графиков при времени опроса 0,01 секунды в приложении на C# с использованием Windows Forms, можно воспользоваться следующими подходами: Для сброса данных при долях секунды можно использовать таймер, который будет запускаться каждый раз при определенном промежутке времени (например, 5 минут), и сбрасывать данные на вкладках. Для этого можно использовать класс System.Windows.Forms.Timer. Ниже приведен пример кода, который сбрасывает данные на вкладках каждые 5 минут: ![]() ![]() 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. Ниже приведен пример кода, который создает три потока для трех графиков и обновляет их данные в параллель: ![]() ![]() 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. Ниже приведен пример кода, который обновляет график на форме из потока: ![]() ![]() private void UpdateGraph1() { while (true) { // Обновление данных графика 1 // Здесь можно добавить код для обновления данных на вашем графике 1 // Обновление графика на форме в главном потоке this.Invoke((MethodInvoker)delegate { // Здесь можно добавить код для обновления графика на форме }); Thread.Sleep(10); // Задержка 10 миллисекунд } } Аналогично можно обновлять графики на остальных вкладках из соответствующих потоков. Надеюсь, это поможет вам исправить вашу программу и достичь требуемого поведения сброса данных и обновления графиков в вашем приложении на C# с использованием Windows Forms. |
Сообщ.
#3
,
|
|
|
Спасибо большое за желание помочь! В программе я использую backgroundWorker и мне хотелось бы найти решение при его применении, чтобы не переделывать программу. Например, как-то подправить функцию backgroundWorker1_ProgressChanged, чтобы и при 0,01 обновление шло нормально. Мне не очень понятно, почему при использовании backgroundWorker при 0,1 графики обновляются нормально, а при 0,01 - нет. В программе количество графиков задается пользователем путем ввода нужного количества названий графиков в файле "Названия графиков.txt", количество графиков может быть от 1 до 6. Ваше решение периодичности сброса данных попробую, надеюсь поможет. Надеюсь на Вашу помощь в исправлении программы.
|
Сообщ.
#4
,
|
|
|
Я попробовал предложенный Вами способ сброса данных - не получилось. Может быть я неправильно его использую? Прикрепил проект со сбросом по таймеру. Пока я не нашел также решение задачи синхронного обновления всех графиков.
Прикреплённый файл ![]() |