Название: Быстрое отображение текстовых данных Отправлено: 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 миллисекунд :) |