Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Bepec от Февраль 27, 2012, 07:34



Название: Скоростное обновление/максимальное быстродействие. Прошу совета.[РЕШЕНО]
Отправлено: Bepec от Февраль 27, 2012, 07:34
День добрый.

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

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

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

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

PS сейчас работает вариант 2.


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Bepec от Февраль 27, 2012, 10:27
Ап. Ну хоть andrew.k приди, скажи своё коронное "всё просто, в поиск" :D


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Tonal от Февраль 27, 2012, 11:45
А модель обязательно нужна?
Тот же QPlainTextEdit не подойдёт?


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Bepec от Февраль 27, 2012, 12:00
Быть может вы незнаете, но QPlainText, при занесении в него выше 40,000 записей жрёт примерно около 800 мб памяти. Это не утечка, это "фича" QPlainText.

А у меня приток данных около 7-8 тысяч в секунду ;)



Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: mutineer от Февраль 27, 2012, 12:01
Делал у себя по варианту 2 (с таймером). Но это внутренняя тулза, так что на проблемы с позицией скролла забил


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Tonal от Февраль 27, 2012, 13:14
Быть может вы незнаете, но QPlainText, при занесении в него выше 40,000 записей жрёт примерно около 800 мб памяти. Это не утечка, это "фича" QPlainText.
А у меня приток данных около 7-8 тысяч в секунду ;)
А его весть непременно нужно хранить в QPlainText?
Может просто ограничится сотней-другой последних maximumBlockCount (http://developer.qt.nokia.com/doc/qt-4.8/qplaintextedit.html#maximumBlockCount-prop)?
А в случае нужды поглянуть что было раньше перезалить нужным куском?


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Bepec от Февраль 27, 2012, 13:53
Скажу просто - чтобы сливать и восстанавливать, нужно или ещё 1 поток организовывать, или неизвестно что.

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

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

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

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

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

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

Вопрос открытый - как лучше реализовать нормальную прокрутку/обновление?


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Bepec от Февраль 28, 2012, 10:41
Ап!


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: _OLEGator_ от Февраль 28, 2012, 14:33
Поидее новые данные пачками закидывать, не по одной записи.
И для  всего блока вызывать один раз вначале операции beginInsert и в конце endInsert.
А вообще непонятно для чего такой большой объем данных одновременно отображать и одновременно работать с ними.


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Bepec от Февраль 28, 2012, 15:21
Вот будут у тебя автоматизированная система тестирования ;)

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

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

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

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


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

И видимо решение с таймером единственно верное в такой ситуации.


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: _OLEGator_ от Февраль 28, 2012, 16:52
Незнаю, моя телепатия здесь не работает. Непонятно, как скролл скачет.
Если ты добавляешь данные в конец модели, а вьюху вниз прокручиваешь - непонятно откуда берется эффект положения скролла не в нижней точке.
Слишком частое обновление модели - я так понимаю с таймером идет накопление данных и периодическое добавление их в модель блоком?


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Bepec от Февраль 28, 2012, 17:15
А вы и не спрашивали про скролл ;) потому и телепатия не работает.

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

Более красивый скрин и прочая выложу завтра, ибо исходники на работе.


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: twp от Март 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.


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Bepec от Март 02, 2012, 21:58
Как бы не поможет ) об этом уже говорили :)


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: twp от Март 02, 2012, 22:02
странно, я что-то не заметил где в теме есть упоминание fetchMore() и canFetchMore()


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Bepec от Март 03, 2012, 11:01
Ну извини меня великодушно. Не упоминалось, однако beginInsertRows и endInsertRows я упоминал в этом контексте.
Т.е. не говорил, а подразумевал ;)


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: twp от Март 03, 2012, 11:15
я так и не понял, ты пробовал в fetchMore() делать beginInsertRows() and endInsertRows() или просто сразу по получении новых данных?


Название: Re: Скоростное обновление/максимальное быстродействие. Прошу совета.
Отправлено: Bepec от Март 03, 2012, 11:35
Пробовал.

Проблема решена. Причиной была одна используемая библиотека ;) Собственно спасибо всем за рассуждения и помощь.  Тема закрыта.