Russian Qt Forum
Ноябрь 23, 2024, 17:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Скоростное обновление/максимальное быстродействие. Прошу совета.[РЕШЕНО]  (Прочитано 9234 раз)
Bepec
Гость
« : Февраль 27, 2012, 07:34 »

День добрый.

Имеется: модель, хранящая текстовые данные, которые являются принимаемыми последовательностями байтов.
Скорость получения - примерно 4000 в секунду.

Нужно: Сделать непринуждённую для пользователя прокрутку (автоматическую) вниз и обновление модели.

Что мешает мне:
1. Делал с beginReset/endReset - задержка съедает 3000 из 4000 пакетов.
2. Делал с таймером, автономно обновляющим модель - появилсся эффект "скачка" для пользователя, при прокрутке вниз бегунок постоянно в позиции 85-87%.
3. Делал с beginInsert/endInsert - аналогично п.1

Вопрос: Как лучше сделать плавное обновление модели, совместимое с адекватной прокруткой?

PS сейчас работает вариант 2.
« Последнее редактирование: Март 03, 2012, 11:36 от Bepec » Записан
Bepec
Гость
« Ответ #1 : Февраль 27, 2012, 10:27 »

Ап. Ну хоть andrew.k приди, скажи своё коронное "всё просто, в поиск" Веселый
Записан
Tonal
Гость
« Ответ #2 : Февраль 27, 2012, 11:45 »

А модель обязательно нужна?
Тот же QPlainTextEdit не подойдёт?
Записан
Bepec
Гость
« Ответ #3 : Февраль 27, 2012, 12:00 »

Быть может вы незнаете, но QPlainText, при занесении в него выше 40,000 записей жрёт примерно около 800 мб памяти. Это не утечка, это "фича" QPlainText.

А у меня приток данных около 7-8 тысяч в секунду Подмигивающий

Записан
mutineer
Гость
« Ответ #4 : Февраль 27, 2012, 12:01 »

Делал у себя по варианту 2 (с таймером). Но это внутренняя тулза, так что на проблемы с позицией скролла забил
Записан
Tonal
Гость
« Ответ #5 : Февраль 27, 2012, 13:14 »

Быть может вы незнаете, но QPlainText, при занесении в него выше 40,000 записей жрёт примерно около 800 мб памяти. Это не утечка, это "фича" QPlainText.
А у меня приток данных около 7-8 тысяч в секунду Подмигивающий
А его весть непременно нужно хранить в QPlainText?
Может просто ограничится сотней-другой последних maximumBlockCount?
А в случае нужды поглянуть что было раньше перезалить нужным куском?
Записан
Bepec
Гость
« Ответ #6 : Февраль 27, 2012, 13:53 »

Скажу просто - чтобы сливать и восстанавливать, нужно или ещё 1 поток организовывать, или неизвестно что.

К тому же вопрос у меня касается Model-View, и задан в соответствующей теме. Потому и ответ хочу про него услышать.

По скорости/потреблению памяти/отображения Model-View лучше QPlainText.

Тем более, сохраняя QPlainText я теряю все установленные цвета/форматирование.

До кучи, каждый принятый пакет должен рассматриваться как отдельный элемент (который расшифровывается встроенной тулзой).

В общем - QPlainTextEdit тут не очень то и подходит. И не предлагайте пожалуйста сохранять тогда данные в HTML. Тормоза от этого HTMLяяя...

to mutineer: У меня как бы тоже внутренняя, но впоследствии вопрос останется и в других программах.

Вопрос открытый - как лучше реализовать нормальную прокрутку/обновление?
Записан
Bepec
Гость
« Ответ #7 : Февраль 28, 2012, 10:41 »

Ап!
Записан
_OLEGator_
Гость
« Ответ #8 : Февраль 28, 2012, 14:33 »

Поидее новые данные пачками закидывать, не по одной записи.
И для  всего блока вызывать один раз вначале операции beginInsert и в конце endInsert.
А вообще непонятно для чего такой большой объем данных одновременно отображать и одновременно работать с ними.
Записан
Bepec
Гость
« Ответ #9 : Февраль 28, 2012, 15:21 »

Вот будут у тебя автоматизированная система тестирования Подмигивающий

Поймёшь. Тем более что проблема не в отображении - а в "обновлении таблицы" и "подёргиваниям скролла".

Данных 2 потока - Туда и Оттуда. И тут уже становится невозможным собирать пакеты по 15/25/50 мс. Ибо погрешность таймера системы составляет горааааздо больше 15мс Подмигивающий

Потому нужно закидывать именно по 1, именно в той последовательности как пришли.

И кстати да, обновление у меня происходит только для добавленного пакета записей раз в 25 мс. (т.е. у меня для всего блока вызывается 1 раз)


Вопрос: что же делать со скроллом? Скачет постоянно на 80-95%, прокручивает до конца, НО при этом создаётся эффект "он же не до конца крутит, программа плохая и т.п."

И видимо решение с таймером единственно верное в такой ситуации.
Записан
_OLEGator_
Гость
« Ответ #10 : Февраль 28, 2012, 16:52 »

Незнаю, моя телепатия здесь не работает. Непонятно, как скролл скачет.
Если ты добавляешь данные в конец модели, а вьюху вниз прокручиваешь - непонятно откуда берется эффект положения скролла не в нижней точке.
Слишком частое обновление модели - я так понимаю с таймером идет накопление данных и периодическое добавление их в модель блоком?
Записан
Bepec
Гость
« Ответ #11 : Февраль 28, 2012, 17:15 »

А вы и не спрашивали про скролл Подмигивающий потому и телепатия не работает.

Вкратце - позиция скролла застывает с подёргиваниями на 80-90 %.

Более красивый скрин и прочая выложу завтра, ибо исходники на работе.
Записан
twp
Гость
« Ответ #12 : Март 02, 2012, 21:45 »

Может это поможет
Цитата: Assistant
To create models that populate incrementally, you can reimplement fetchMore() and canFetchMore(). If the reimplementation of fetchMore() adds rows to the model, beginInsertRows() and endInsertRows() must be called.
Записан
Bepec
Гость
« Ответ #13 : Март 02, 2012, 21:58 »

Как бы не поможет ) об этом уже говорили Улыбающийся
Записан
twp
Гость
« Ответ #14 : Март 02, 2012, 22:02 »

странно, я что-то не заметил где в теме есть упоминание fetchMore() и canFetchMore()
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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