Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.218.61.16] |
|
Сообщ.
#1
,
|
|
|
Приложение Windows Forms, Windows 10. В программе на вкладках соответственно задаются параметры, выводятся графики и измеренные (эмулируются) значения. При времени опроса каналов от 1 секунды и более данные сбрасываются через 5 минут, а при дробных значениях - данные вообще не сбрасываются. При времени опроса 0,1 секунда 3 графика выводятся синхронно, а при 0,01 секунде двигается только первый график, а 2 других замирают. Обновление графиков происходит только при переключении вкладок. Подскажите, пожалуйста, как исправить программу, чтобы:
- данные сбрасывались через заданный промежуток времени при долях секунды; - графики на вкладке изменялись бы синхронно при 0,01 секунде. Проект прикрепил. Прикреплённый файлcsFormsTest.zip (15,35 Кбайт, скачиваний: 23) |
Сообщ.
#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
,
|
|
|
Я попробовал предложенный Вами способ сброса данных - не получилось. Может быть я неправильно его использую? Прикрепил проект со сбросом по таймеру. Пока я не нашел также решение задачи синхронного обновления всех графиков.
Прикреплённый файлcsFormsTest.zip (15,05 Кбайт, скачиваний: 24) |
Сообщ.
#5
,
|
|
|
Подход боюсь немного не правильный. У Вас данные генерятся непосредственно в потоке отображения, поэтому и тестовый пример получился неадекватным. Данные напряжений скорее всего будут приходить от какого либо устройства, либо по таймингу с самого устройства, либо по запросу вашей программы. В первом случае проще, потому как по приходу данных будет калбек, ну скажем от COM порта и по нему вы будете передавать данные для отображения пользователю, во втором случае надо будет создать поток (именно поток а не бекграунд воркер) чтобы из него дергать устройство на отдачу данных. И последнее, накопительный график в Вашем случае это зло, ибо думаю что данные вы будете наблюдать не минуту и не 2, а чарт имеет свойство при больших данных дико тормозить и лагать, поэтому лучше сделать скользящий буфер для отображения графика точек на 500.
|