Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Mechatronic от Ноябрь 01, 2011, 07:00



Название: Быстрое отображение текстовых данных
Отправлено: Mechatronic от Ноябрь 01, 2011, 07:00
Здравствуйте!
Существует проблема следующего характера:
Программа обслуживает подключенное по RS-232 (COM-порт) устройство. Кроме всего прочего функционала она обязана выводить в интерфейс пользователя все, что примет из порта(общение идет в ASCII кодах)- что-то вроде minicom в Линуксе. Данные могут сыпаться огромными пакетами на скорости 115200 бит/с.
Сейчас используется компонент QTextBrowser, соединенный с компонентом, обслуживающим порт (находится в отдельном потоке), через слот insertPlainText. Интерфейс "подвисает" при большой плотности входного потока (на некоторых компьютерах сразу, как в QTextBrowser появляется полоса прокрутки). Подскажите, пожалуйста, как выполнить отображение правильно.
Если отрубать от текстового буфера хвост и делать setPlainText()  каждый раз, то не увисает. Это при условии, что хвост помещается в браузер без прокрутки. Но к сожалению,желательно иметь всю историю в визуальном доступе, ну или хотя бы более приличный размер "хвоста" как в том же minicom'e.
Думается, раз всякие minicom'ы не виснут, есть надежда и у нас.


Название: Re: Быстрое отображение текстовых данных
Отправлено: LisandreL от Ноябрь 01, 2011, 19:05
Самый банальный - накапливать новые данные в некотором невизуальном буфере (QSring, QByteArray…), а в GUI в слоте updateLog() который будет вызывать сам себя через singleShot (можно и по таймеру).
Ну и разумеется чтение/запись в порт должна быть в отдельном потоке.


Название: Re: Быстрое отображение текстовых данных
Отправлено: Bepec от Ноябрь 02, 2011, 06:56
Разрабатывал недавно похожую вещь.

LisandreL прав - всего то нужно данные отправлять кусками.
А как - уже твое дело.
Можно и периодично в определенный промежуток, к примеру, раз в полсекунды. Пользователю все же ненужна точность вплоть до 5 миллисекунд :)