https://www.qcustomplot.com/index.php/demos/realtimedatademo
Графики я отрисовываю по таймеру с частотой 30мс. И все хорошо работает, кроме того, что в диспетчере я вижу как растет потребление памяти ~30мб в час.
Тестирование с помощью visual Leak Detector говорит, что утечек нет.
Дальнейшими умозаключениями я пришел к тому что это AddData ссылка выше( ui->customPlot->graph(0)->addData(key, qSin(key)+qrand()/(double)RAND_MAX1qSin(key/0.3843));)
Так и оказалось AddData складывает данные для рисования точки в QCPGraphDataContainer, а потом я перерисовываю все replot()' ом.
Вывожу Plot->graph(i)->data()->size() и вижу как размер растет для каждого graph(), в итоге софтина разжирается и все падает через n-ое количество часов.
Я сделал очистку Plot->graph(i)->data()->clear(), если размер > 500.
Все хорошо работает, память не жрет, но clear() обнуляет QCPDataContainer, мои данные обнуляются replot() начинает отрисовывать заного.
Как сделать так, чтобы DataContainer не переполнялся?.
Например за час DataContaner накопит 12*10^5 точек для отрисовки, которые отрисовывает в реальном времени с помощью replot().
Видится мне, что нужно чтобы replot отрисовал все 12*10^5, после чего очистить QCPDataContainer, снова начать набирать данные в Container и отрисовывать их replot()'ом, но как сделать так чтобы он не чистил с графика предыдущие 12*10^5 точек?)
Возможно ли это сделать? верный ли подход? Как-то же работают существующие софтины с графиками реального времени. Да еще и хранят большие архивы.
Скопировать контейнер в какую либо другую переменную?🤔
при достижении определенного числа точек тебе надо при добавлении точки в конец, удалять точку из начала, чтобы не увеличивать емкость контейнера постоянно
Полазив у них по доке, я нашел метод void QCustomPlot::setupPaintBuffers ( ) Я бы глянул в эту сторону, ибо у QCPAbstractPaintBuffer есть параметр size. Который предположительно ограничивает размер буфера.
Обсуждают сегодня