Russian Qt Forum

Qt => Вопросы новичков => Тема начата: deMax от Декабрь 03, 2015, 15:20



Название: circular buffer для qt
Отправлено: deMax от Декабрь 03, 2015, 15:20
Есть массив данных QList<Data> и в этом массиве всегда size элементов. Каждую секунду данные обновляются, в конец дописывают новые данные вначале стирают, длинна не изменяется. Как это реализовать правильнее?
1. Использовать QList push+pop (будет туда сюда память гонять)
2. Создать вектор/массив и хранить смещение на начало?


Название: Re: Контейнер для хранения циклограммы
Отправлено: PimenS от Декабрь 03, 2015, 15:33
А QQueue<T> не подходит?


Название: Re: Контейнер для хранения циклограммы
Отправлено: ibnz от Декабрь 03, 2015, 15:34
http://www.boost.org/doc/libs/1_39_0/libs/circular_buffer/doc/circular_buffer.html


Название: Re: Контейнер для хранения циклограммы
Отправлено: deMax от Декабрь 03, 2015, 15:41
ibnz, circular_buffer оно. Есть решение на qt без буста(конечно легко и самому реализовать, но готовые решения как правило читабельнее - меньше кода)


Название: Re: circular buffer для qt
Отправлено: deMax от Декабрь 03, 2015, 15:50
Спасибо за подсказку.

нашел класс QCircularBuffer, а зачем ему?
Код:
#include <Qt3D>
qmake: QT += 3dcore


Название: Re: circular buffer для qt
Отправлено: Vamireh от Декабрь 04, 2015, 06:56
Например, QCustomPlot писали не дураки, надо полагать. Там тупо сделано:
Код:
while (queue.size() > needSize) queue.dequeue();


Название: Re: circular buffer для qt
Отправлено: lit-uriy от Декабрь 04, 2015, 07:55
1. Использовать QList push+pop (будет туда сюда память гонять)
Используй QList::reserve(int)


Название: Re: circular buffer для qt
Отправлено: deMax от Декабрь 04, 2015, 08:45
Используй QList::reserve(int)
Т.е. в принципе если сделать reserve(size), потом удалить в начале, вставить в конец то с памятью оно играться не буде и операция быстрая будет?

Рисую линию из этого массива через QPainterPath, можно ли у PainterPath удалять начальные элементы или каждый раз его заново создавать?
иногда прежде чем загнать в QPainterPath линию сглаживаю сплайнами(т.е. кол-во точек умножается на splineCount).
p.s. Можно ли рисовать линии с координатами int/double? (У float 25бит на значение иногда не хватает и страдает точность).


Название: Re: circular buffer для qt
Отправлено: Igors от Декабрь 04, 2015, 10:20
1. Использовать QList push+pop (будет туда сюда память гонять)
Зачем push/pop если QList заточен и на добавление в голову? (см QList::prepend()) как и на удаление с головы. Странно что фаны не обвинили Вас в "незнании документации" :)  Формально самопальный контейнер может быть быстрее, но выигрыш здесь крохи, связываться не стоит

Рисую линию из этого массива через QPainterPath, можно ли у PainterPath удалять начальные элементы или каждый раз его заново создавать?
иногда прежде чем загнать в QPainterPath линию сглаживаю сплайнами(т.е. кол-во точек умножается на splineCount).
p.s. Можно ли рисовать линии с координатами int/double? (У float 25бит на значение иногда не хватает и страдает точность).
Вам же прекрасно известно - сначала надо в букварь заглянуть, а потом вопросы задавать. Где Вы видите методы удаления из QPainterPath? Зато полно методов принимающих QRectF и QPointF


Название: Re: circular buffer для qt
Отправлено: Old от Декабрь 04, 2015, 10:45
2. Создать вектор/массив и хранить смещение на начало?
Хранить смещения на элементы для чтения и записи.
Достоинства кольцевого буфера в том, что он не требует переаллокации совсем. Использование других контейнеров скорее всего потащат за собой переаллокации.
Реализовать колцевой буфер дело нескольких минут.


Название: Re: circular buffer для qt
Отправлено: Авварон от Декабрь 04, 2015, 12:40
В коре кутей где-то есть приватный циркулярный буффер нормальный (с фиксированным размером).


Название: Re: circular buffer для qt
Отправлено: deMax от Декабрь 04, 2015, 23:43
В коре кутей где-то есть приватный циркулярный буффер нормальный (с фиксированным размером).
это? http://www.prog.org.ru/index.php?topic=29591.msg217470#msg217470