Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Ground от Июня 15, 2012, 10:03



Название: Кеширование текста, выводимого в QLabel
Отправлено: Ground от Июня 15, 2012, 10:03
Всем привет!
У меня в приложении есть метка, в которую я вывожу HTML-код с цифровыми значениями и некоторым текстом. Это действие нужно повторять с интервалом 20мс. В тексте меняется всего несколько цифр.
Сейчас у меня строка, содержащая весь текст, генерируется каждый тик таймера заново. Вот участок кода, генерирующий строку:
Код
C++ (Qt)
   QString toolTipString;
   // Формирование заголовка
   toolTipString.append("<h2>").append(mElementName).append("</h2>");
   // Формирование таблицы
   toolTipString.append("<table border='1' cellspacing='0' cellpadding='3'>");
   toolTipString.append("<tr><td align='center' width=20%><b>Бит</b></td><td align='center' width=20%><b>Значение</b></td><td align='center' width=60%><b>Описание</b></td></tr>");
   for (int i = 0; i < mElementLogic.data()->parametersCount(); i++)
   {
       toolTipString.append(QString("<tr><td align='center' width=20%>%1</td><td align='center' width=20%>%2</td><td align='left' width=60%><nobr>%3</nobr></td></tr>")
                            .arg(mStartBits[i])
                            .arg(mState[i])
                            .arg(mDescriptions[i]));
   }
   toolTipString.append("</table>");
 
   emit signalSendToolTipText(toolTipString, mMousePosition);
После генерации строка отправляется в другой класс, где и выводится на экран.
Основная проблема в том, что подобный алгоритм очень сильно нагружает процессор, хотя в тексте нужно поменять всего три цифры.
И вопрос - как это все можно оптимизировать? У меня была идея с кешированием информации. Примерный принцип заключается в следующем: первый раз отправляем строку полностью, после - только значения, без текста. А уже непосредственно перед выводом подставляем значения в текст и выводим его на экран. Но будет ли это быстрее, чем есть сейчас? Или есть какие-нибудь другие способы?


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: alexman от Июня 15, 2012, 10:22
Попробуй выводить раз в секунду (по таймеру проверяй надо выводить или нет...). Смысл каждые 20 мс выводить?


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: Ground от Июня 15, 2012, 10:36
Попробуй выводить раз в секунду (по таймеру проверяй надо выводить или нет...). Смысл каждые 20 мс выводить?
Требование к ПО. Само собой, 50Гц - это режим высокой нагрузки, обычно приложение работает на 10Гц или даже меньше.
Данные для вывода поступают только в том случае, если они изменились.

Мне просто интересно, на что тратится большая часть ресурсов ЦП, на генерацию строки, пересылку сигнала, работу HTML-парсера или же на вывод текста на экран?


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: alexman от Июня 15, 2012, 10:45
так глянь в профилировщике :)


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: GreatSnake от Июня 15, 2012, 10:55
Мдя... Ну кто же для таких задач использует такого монстра как QLabel в режиме Qt::RichText  ???
Создайте свою форму c отдельными 3-мя QLabel фиксированного размера.


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: ddrtn от Июня 15, 2012, 11:09
А смысл выводить раз в 20 мс в ГУИ?
Человеческий глаз все равно эти данные не воспримет.
Почему нельзя приходящие данные накапливать, а выводить по таймеру последние пришедшие?
2-4 раза в секунду уже будет достаточно.


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: Igors от Июня 15, 2012, 11:14
Не вижу как приведенный фрагмент может тормозить на пионерской частоте 50 Герц. Должен быть очень хороший parametersCount. Если уверены что тормоз именно здесь - ну можно создать одну большую строку а потом в нее вставлять что нужно одним проходом


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: Ground от Июня 15, 2012, 11:20
Мдя... Ну кто же для таких задач использует такого монстра как QLabel в режиме Qt::RichText  ???
Создайте свою форму c отдельными 3-мя QLabel фиксированного размера.
Если я правильно понял вашу идею, мы в три QLabel подставляем передаваемые значения (это даже если не брать во внимание, что у нас может быть несколько строк значений, т.е. 3*10 = 30 штук QLabel). Но у нас же есть еще таблица, задаваемая с помощью HTML. Как ее рисовать - через paintEvent?

А смысл выводить раз в 20 мс в ГУИ?
Человеческий глаз все равно эти данные не воспримет.
Почему нельзя приходящие данные накапливать, а выводить по таймеру последние пришедшие?
2-4 раза в секунду уже будет достаточно.
Требования продиктованы техническим заданием, хотя смысла в этом пункте мало, я с вами согласен.

Не вижу как приведенный фрагмент может тормозить на пионерской частоте 50 Герц. Должен быть очень хороший parametersCount. Если уверены что тормоз именно здесь - ну можно создать одну большую строку а потом в нее вставлять что нужно одним проходом
При parametersCount == 2 не тормозит вообще, если parametersCount == 15 - загрузка ЦП достигает 30%. И это на стационарной машине, а ПО, в основном, применяться будет на нетбуках.


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: GreatSnake от Июня 15, 2012, 11:55
Если я правильно понял вашу идею, мы в три QLabel подставляем передаваемые значения (это даже если не брать во внимание, что у нас может быть несколько строк значений, т.е. 3*10 = 30 штук QLabel). Но у нас же есть еще таблица, задаваемая с помощью HTML. Как ее рисовать - через paintEvent?
Таблицу можно отрисовать используя QGridLayout. См. здесь (http://www.prog.org.ru/topic_22089_0.html) как.


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: GreatSnake от Июня 15, 2012, 11:58
Не вижу как приведенный фрагмент может тормозить на пионерской частоте 50 Герц. Должен быть очень хороший parametersCount. Если уверены что тормоз именно здесь - ну можно создать одну большую строку а потом в нее вставлять что нужно одним проходом
Дык похоже у ТС проблема не в генерации html, а в его последующей отрисовке.


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: DmitryM от Июня 15, 2012, 12:23
И вопрос - как это все можно оптимизировать?
Для начала заменить вызов arg(), на sprintf()


Название: Re: Кеширование текста, выводимого в QLabel
Отправлено: Igors от Июня 15, 2012, 12:37
Дык похоже у ТС проблема не в генерации html, а в его последующей отрисовке.
Та отож. Тот фрагмент ускорить конечно можно, но не хочется делать если причина не в нем