Russian Qt Forum
Июня 09, 2025, 00:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кеширование текста, выводимого в QLabel  (Прочитано 5801 раз)
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);
После генерации строка отправляется в другой класс, где и выводится на экран.
Основная проблема в том, что подобный алгоритм очень сильно нагружает процессор, хотя в тексте нужно поменять всего три цифры.
И вопрос - как это все можно оптимизировать? У меня была идея с кешированием информации. Примерный принцип заключается в следующем: первый раз отправляем строку полностью, после - только значения, без текста. А уже непосредственно перед выводом подставляем значения в текст и выводим его на экран. Но будет ли это быстрее, чем есть сейчас? Или есть какие-нибудь другие способы?
Записан
alexman
Гость
« Ответ #1 : Июня 15, 2012, 10:22 »

Попробуй выводить раз в секунду (по таймеру проверяй надо выводить или нет...). Смысл каждые 20 мс выводить?
Записан
Ground
Гость
« Ответ #2 : Июня 15, 2012, 10:36 »

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

Мне просто интересно, на что тратится большая часть ресурсов ЦП, на генерацию строки, пересылку сигнала, работу HTML-парсера или же на вывод текста на экран?
Записан
alexman
Гость
« Ответ #3 : Июня 15, 2012, 10:45 »

так глянь в профилировщике Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Июня 15, 2012, 10:55 »

Мдя... Ну кто же для таких задач использует такого монстра как QLabel в режиме Qt::RichText  Непонимающий
Создайте свою форму c отдельными 3-мя QLabel фиксированного размера.
Записан

Qt 5.11/4.8.7 (X11/Win)
ddrtn
Гость
« Ответ #5 : Июня 15, 2012, 11:09 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Июня 15, 2012, 11:14 »

Не вижу как приведенный фрагмент может тормозить на пионерской частоте 50 Герц. Должен быть очень хороший parametersCount. Если уверены что тормоз именно здесь - ну можно создать одну большую строку а потом в нее вставлять что нужно одним проходом
Записан
Ground
Гость
« Ответ #7 : Июня 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%. И это на стационарной машине, а ПО, в основном, применяться будет на нетбуках.
« Последнее редактирование: Июня 15, 2012, 11:25 от Ground » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #8 : Июня 15, 2012, 11:55 »

Если я правильно понял вашу идею, мы в три QLabel подставляем передаваемые значения (это даже если не брать во внимание, что у нас может быть несколько строк значений, т.е. 3*10 = 30 штук QLabel). Но у нас же есть еще таблица, задаваемая с помощью HTML. Как ее рисовать - через paintEvent?
Таблицу можно отрисовать используя QGridLayout. См. здесь как.
Записан

Qt 5.11/4.8.7 (X11/Win)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Июня 15, 2012, 11:58 »

Не вижу как приведенный фрагмент может тормозить на пионерской частоте 50 Герц. Должен быть очень хороший parametersCount. Если уверены что тормоз именно здесь - ну можно создать одну большую строку а потом в нее вставлять что нужно одним проходом
Дык похоже у ТС проблема не в генерации html, а в его последующей отрисовке.
Записан

Qt 5.11/4.8.7 (X11/Win)
DmitryM
Гость
« Ответ #10 : Июня 15, 2012, 12:23 »

И вопрос - как это все можно оптимизировать?
Для начала заменить вызов arg(), на sprintf()
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Июня 15, 2012, 12:37 »

Дык похоже у ТС проблема не в генерации html, а в его последующей отрисовке.
Та отож. Тот фрагмент ускорить конечно можно, но не хочется делать если причина не в нем
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 3.175 секунд. Запросов: 23.