Название: Кеширование текста, выводимого в QLabel Отправлено: Ground от Июня 15, 2012, 10:03 Всем привет!
У меня в приложении есть метка, в которую я вывожу HTML-код с цифровыми значениями и некоторым текстом. Это действие нужно повторять с интервалом 20мс. В тексте меняется всего несколько цифр. Сейчас у меня строка, содержащая весь текст, генерируется каждый тик таймера заново. Вот участок кода, генерирующий строку: Код После генерации строка отправляется в другой класс, где и выводится на экран. Основная проблема в том, что подобный алгоритм очень сильно нагружает процессор, хотя в тексте нужно поменять всего три цифры. И вопрос - как это все можно оптимизировать? У меня была идея с кешированием информации. Примерный принцип заключается в следующем: первый раз отправляем строку полностью, после - только значения, без текста. А уже непосредственно перед выводом подставляем значения в текст и выводим его на экран. Но будет ли это быстрее, чем есть сейчас? Или есть какие-нибудь другие способы? Название: 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 ??? Если я правильно понял вашу идею, мы в три QLabel подставляем передаваемые значения (это даже если не брать во внимание, что у нас может быть несколько строк значений, т.е. 3*10 = 30 штук QLabel). Но у нас же есть еще таблица, задаваемая с помощью HTML. Как ее рисовать - через paintEvent?Создайте свою форму c отдельными 3-мя QLabel фиксированного размера. А смысл выводить раз в 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, а в его последующей отрисовке. Та отож. Тот фрагмент ускорить конечно можно, но не хочется делать если причина не в нем |