之前一篇介绍了如何滚动数据和时间轴:http://labisart.com/blog/index.php/Home/Index/article/aid/200
但是呢,一直adddata会导致内存开销增大,在csdn上那些叼毛也没说怎么删除数据好一点。
长时间运行是不可接受的,这就涉及到如何定时删除数据释放内存的问题。
实际测试,
mGraph1->data()->clear(); mGraph2->data()->clear(); // 以及: //ui->widCapGraphics->clearGraphs(); //ui->widCapGraphics->clearPlottables(); //ui->widCapGraphics->plotLayout()->clear();
这2种方式还是不能很好的控制内存。而且一下clear了导致会断线,很挫。
removebefore()也不太好使!(可能没用对?)
仔细看文档有一个setData函数,我们自定义两个qvector<double>变量传进去就可以自己控制内存开销了,此时可以只滚动曲线,不滚动x坐标。
具体思路是:
1、key.append(0~99),放100个数
2、serial.append(全部初始化为0);
3、更新时,serial.removefirst(),然后serial.append(新数据)。再次customplot->setData(key,serial)就可以了!
现在有个问题,x以个数显示没问题了,就用key.append(0~99).
那么如果x轴用时间怎么来赋值这个key呢?其实只要知道,x轴以时间为单位时,以秒为基本单位赋值就好了,具体如下:
初始化:
// 设置x轴为时间.%z QSharedPointer<QCPAxisTickerTime> timeTicker(new QCPAxisTickerTime); timeTicker->setTimeFormat("%h:%m:%s"); ui->widCapGraphics->xAxis->setTicker(timeTicker); // 使用外部数据,提前10秒初始化,100毫秒刷新一次,共100个数据 int64_t now = QTime::currentTime().msecsSinceStartOfDay(); now -= 10*1000; for(int i=0;i<100;i++){ m_key.append((now + i*100)/1000.0); //m_key.append(i); // ok了 m_sdata.append(sin(0.6f*i)); m_sdata2.append(cos(0.25f*i)); } mGraph1->setData(m_key,m_sdata); mGraph2->setData(m_key,m_sdata2);
定时刷新:
// 改变数据 m_key.removeFirst(); m_key.append(nowtime/1000.0); m_sdata.removeFirst(); m_sdata.append(sin(0.6f*m_cnt)); m_sdata2.removeFirst(); m_sdata2.append(cos(0.25f*m_cnt)); mGraph1->setData(m_key,m_sdata,true); mGraph2->setData(m_key,m_sdata2,true);
这个有点像qcharts的replace函数,不过对比了一下,qcharts的普通方法cpu占用率太高了,比qcustomplot高一倍,用replace勉强能达到qcustomplot的标准,所以还是用qcustomplot。
实例:
单独下载查看:
Duffy:这个时间轴游标标签怎么设置的呢?大佬有源码可以参考吗?
2024-05-10 10:47:31 回复
yefeng:线条多,数据量大情况下,我发现这个库运行时间长了会奔溃getlines里面取可见区域位置时,内存已被释放。
2022-09-21 09:26:35 回复
Marcellus:我这边个人理解最好使用QCPGraph类的QCPGraph::setData(QSharedPointer<QCPGraphDataContainer> data);在外部实现一个DataManager类,管理QSharedPointer<QCPGraphDataContainer>data_buffer数据。当data_buffer数据长度超过多少秒后,就可以主动清除一次。也方便实现多线程数据输入。不过我觉得qcustomplot最坑的是卡顿问题。我这边实现的1ms的实时数据采样, 20ms的QCusomplot的updatePlot()定时刷新。setScatterStyle千万别是ssDot,还有最好不要设置legend可选择,这个功能打开后,在实时刷新下,选中波形后就可能卡顿了。不过我这边测试如果是20ms的实时数据采样,貌似也不会卡。
2021-09-27 15:32:33 回复