Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / GUI виснет на больших объемах данных / 25 сообщений из 26, страница 1 из 2
03.08.2020, 12:08
    #39986097
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI виснет на больших объемах данных
Я получаю данные по серийному порту и отображаю их в 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
03.08.2020, 13:34
    #39986112
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI виснет на больших объемах данных
Пробуй читать данные в другом потоке.
...
Рейтинг: 0 / 0
03.08.2020, 13:42
    #39986114
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI виснет на больших объемах данных
vb_sub
Пробуй читать данные в другом потоке.

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

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

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

с языка снял.

Я бы еще глянул в сторону DataFlow. Там и буферизация из коробки и как мне кажется с последовательным портом работать будет загляденье.
...
Рейтинг: 0 / 0
03.08.2020, 15:39
    #39986142
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI виснет на больших объемах данных
Вообще какой смысл выводить данные в контрол для чтения пользователем, если скорость их поступления настолько высока. У Вас пользователи читают и форматируют текст из RichTextbox быстрее, чем они читаются из серийного порта?Скорее всего нужен другой контрол, фильтрация, агрегирование данных в общем пересмотр UI/UX.
...
Рейтинг: 0 / 0
03.08.2020, 15:44
    #39986147
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI виснет на больших объемах данных
Сон Веры Павловны
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
03.08.2020, 15:46
    #39986148
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI виснет на больших объемах данных
Roman Mejtes
Сон Веры Павловны,

с языка снял.

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

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

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

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

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

Неизвестно, с какой скоростью там поступают пакеты. Оконную очередь (через которую идёт вся синхронизация в винформс) без проблем загрузить до фризов UI и на обычном label.
...
Рейтинг: 0 / 0
04.08.2020, 12:54
    #39986355
vb_sub
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI виснет на больших объемах данных
Возможно применение Channels в данной ситуации поможет уменьшить MemoryAllocation и контрол станет работать повеселее.
...
Рейтинг: 0 / 0
04.08.2020, 16:08
    #39986441
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI виснет на больших объемах данных
да. с буферизацией работает хорошо.
обнаружил еще проблему - если попытаться закрыть форму во время приема сообщений - форма виснет намертво.
пробовал
Код: 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
04.08.2020, 16:24
    #39986446
jenya7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GUI виснет на больших объемах данных
виснет тут
Код: c#
1.
2.
if (serial_port.IsOpen)
    serial_port.Close();


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


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


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

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

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


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