powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / GUI виснет на больших объемах данных
25 сообщений из 26, страница 1 из 2
GUI виснет на больших объемах данных
    #39986097
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я получаю данные по серийному порту и отображаю их в RichTextBox.
Код: c#
1.
2.
3.
4.
5.
6.
7.
 private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
 {
        string str = serial_port.ReadExisting();
        Invoke((MethodInvoker)delegate {
            richTextBoxReceive.AppendText(str);
          });   
 }


все работает хорошо пока серийный порт не начинает строчить с большой скоростью. тогда все виснет через пару секунд.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986112
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пробуй читать данные в другом потоке.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986114
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Пробуй читать данные в другом потоке.

прием по серийному порту происходит в отдельном потоке.
а читаю я из потока GUI.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986123
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>jenya7, сегодня, 13:42 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1327954&msg=22177005][22177005]
>...а читаю я из потока GUI.
<
Попробуйте писать в файл (кто даёт ошибку).
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986128
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВМоисеев
>jenya7, сегодня, 13:42 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1327954&msg=22177005][22177005]
>...а читаю я из потока GUI.
<
Попробуйте писать в файл (кто даёт ошибку).

в файл пишет без проблем. затык скорее всего в контроле. он не справляется с потоком данных. я всегда подозревал что RichTextBox дохленький но ничего другого в наличии нету.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986138
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
в файл пишет без проблем. затык скорее всего в контроле. он не справляется с потоком данных. я всегда подозревал что RichTextBox дохленький но ничего другого в наличии нету.

При чем здесь RTB? Любой контрол заткнется, если в него пихать данные из другого потока с определённой скоростью. И Invoke здесь не поможет вообще - он лишь делает синхронизацию с потоком-владельцем. И BeginInvoke тоже не поможет. Здесь надо в читающем потоке заполнять буфер определённого размера (размер зависит от скорости поступления данных), по заполнению буфера, или по таймауту поступления очередной порции данных вываливать буфер в контрол.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986141
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

с языка снял.

Я бы еще глянул в сторону DataFlow. Там и буферизация из коробки и как мне кажется с последовательным портом работать будет загляденье.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986142
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще какой смысл выводить данные в контрол для чтения пользователем, если скорость их поступления настолько высока. У Вас пользователи читают и форматируют текст из RichTextbox быстрее, чем они читаются из серийного порта?Скорее всего нужен другой контрол, фильтрация, агрегирование данных в общем пересмотр UI/UX.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986147
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны
jenya7
в файл пишет без проблем. затык скорее всего в контроле. он не справляется с потоком данных. я всегда подозревал что RichTextBox дохленький но ничего другого в наличии нету.

При чем здесь RTB? Любой контрол заткнется, если в него пихать данные из другого потока с определённой скоростью. И Invoke здесь не поможет вообще - он лишь делает синхронизацию с потоком-владельцем. И BeginInvoke тоже не поможет. Здесь надо в читающем потоке заполнять буфер определённого размера (размер зависит от скорости поступления данных), по заполнению буфера, или по таймауту поступления очередной порции данных вываливать буфер в контрол.

а как? так можно?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
     string str = serial_port.ReadExisting();
     Invoke((MethodInvoker)delegate {
         string_builder.Append(str);

         if (string_builder.Length > 128)
         {
               richTextBoxReceive.AppendText(string_builder.ToString());
               string_builder.Clear();
          }
                    
       });    
 }
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986148
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes
Сон Веры Павловны,

с языка снял.

Я бы еще глянул в сторону DataFlow. Там и буферизация из коробки и как мне кажется с последовательным портом работать будет загляденье.

где такой есть - DataFlow? в Windows Form не нашел.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986151
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
Вообще какой смысл выводить данные в контрол для чтения пользователем, если скорость их поступления настолько высока. У Вас пользователи читают и форматируют текст из RichTextbox быстрее, чем они читаются из серийного порта?Скорее всего нужен другой контрол, фильтрация, агрегирование данных в общем пересмотр UI/UX.

для отладки очень удобно. в контроллере бежит скрипт и нужно видеть результат его работы.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986163
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,
почему именно RichTextBox? Тебе нужна возможность редактировать и форматировать выводимый текст?
Если просто читать, то вполне и Label хватит. Тем более тебе нужна какая-то структура, которая реализует Paging данных, то есть старые просмотренные данные должны удаляться из Label, чтобы не было переполнения.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986164
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vb_sub
jenya7,
почему именно RichTextBox? Тебе нужна возможность редактировать и форматировать выводимый текст?
Если просто читать, то вполне и Label хватит. Тем более тебе нужна какая-то структура, которая реализует Paging данных, то есть старые просмотренные данные должны удаляться из Label, чтобы не было переполнения.

редактировать и форматировать не нужно в принципе. но какая существенная разница между Label и RichTextBox ?
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986173
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,
процентов на 95, то что label не исправит коренным образом ситуацию, но существенная разница в том что label как объект проще и теоретически должен работать быстрее, потому что у него проще структура. Ну и визуально он состоит из меньшего количества объектов, соответственно и рендерить легче.
Ну а если прямо хочется до конца идти со своей идеей записи всего в контрол, то лучше попробовать следующий способ.
1) Эмпирически определяешь с какой частотой можно писать в RichTextBox и он визуально не тормозит.
2) Организуешь очередь из сообщений с серийного порта и отправляешь их в контрол с этой периодичностью.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986187
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>jenya7, сегодня, 14:28 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1327954&msg=22177033][22177033]
>в файл пишет без проблем. затык скорее всего в контроле…
<
Попробуй использовать циклический буфер между серийным портом и RichTextBox.
Если нагрузка пульсирующая, то можно добиться ок, иначе будет потеря сообщений.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986189
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vb_sub
процентов на 95, то что label не исправит коренным образом ситуацию
Процентов 95, что исправит ситуацию, ибо RTB тормозной очень. ТС взялся забивать гвозди даже не микроскопом... токарным станком.... ))

Но это не отменяет необходимость буферизации.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986200
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
Процентов 95, что исправит ситуацию, ибо RTB тормозной очень.

Неизвестно, с какой скоростью там поступают пакеты. Оконную очередь (через которую идёт вся синхронизация в винформс) без проблем загрузить до фризов UI и на обычном label.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986355
vb_sub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно применение Channels в данной ситуации поможет уменьшить MemoryAllocation и контрол станет работать повеселее.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986441
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да. с буферизацией работает хорошо.
обнаружил еще проблему - если попытаться закрыть форму во время приема сообщений - форма виснет намертво.
пробовал
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (serial_port.IsOpen)
    {
        serial_port.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler);
        serial_port.Close();
    }
}


не помогло.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986446
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
виснет тут
Код: c#
1.
2.
if (serial_port.IsOpen)
    serial_port.Close();


невозможно закрыть принимающий порт.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986455
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так тоже виснет
Код: c#
1.
2.
 if (serial_port.IsOpen)
     serial_port.Dispose();


всё? всё пропало?
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986575
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нашел в чем проблема.
в DataReceivedHandler вместо
Код: c#
1.
Invoke((MethodInvoker)delegate


нужно использовать
Код: c#
1.
BeginInvoke((MethodInvoker)delegate
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986577
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделали еще хуже, на самом деле.
вместо того, чтоб сделать как вам советовали, вы еще больше наговнокодили
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986584
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes
сделали еще хуже, на самом деле.
вместо того, чтоб сделать как вам советовали, вы еще больше наговнокодили

мне много чего советовали, но конкретных примеров я так и не увидел.
...
Рейтинг: 0 / 0
GUI виснет на больших объемах данных
    #39986599
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7
но конкретных примеров я так и не увидел.

Да мы в принципе можем и сделать всё за Вас. За соответствующую оплату. Без неё - для человека, который в голову не только ест, вполне достаточно того, что было приведено выше. Если что-то непонятно, то вполне можно задать доп. вопросы, но требовать чего-то большего несколько странно.
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / GUI виснет на больших объемах данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]