Название: Скоростное обновление/максимальное быстродействие. Прошу совета.[РЕШЕНО] Отправлено: 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. А его весть непременно нужно хранить в QPlainText?А у меня приток данных около 7-8 тысяч в секунду ;) Может просто ограничится сотней-другой последних 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 Пробовал.
Проблема решена. Причиной была одна используемая библиотека ;) Собственно спасибо всем за рассуждения и помощь. Тема закрыта. |