我正在为Qt开发一个Gui模块,用于绘制实时测量数据,类似于数字示波器,基于Qwt。目前一切正常,但可能还有一些功能需要添加 ;-)
目前,数据以列方式存储在QVectors中,与另一个独立的QObject中的全局时间参考QVector一起存储。因此,可以按行丢弃数据以仅保留一定过去的Measurement。所有QVectors始终具有相同的长度。然后可以按行进行时间正确的绘图在QwtPlot中。
我希望更加封装数据存储,以使其更独立于测量工作。因此,很好将每个测量的时间坐标单独放在一个QObject中,并将它们与数据一起放入另一个QObject中,该QObject接受并传递数据。然后会有10或20个这样的QObjects,每个数据通道一个,由覆盖在QwtPlot上方的QObject分别绘制。
现在,数据可以是动态的,无论数据在存储、修改或之间丢弃的方式如何,都不应对外部可见。
我的问题是:这样做明智吗?20或30个QObject,每个包含10000个测量值、10000个时间值,以及一个类似大小的单独内存区域(动态填充),其中子集数据用于绘图...是否明智地将每个测量值作为信号发送到其QObject中,每秒约1kHz的频率?信号/槽机制来自于将每个OBject后期设置为QThread,并在数据上实现实时过滤,如低通或FFT - 因此,在多线程环境中,信号/槽连接很方便来控制输出?如何在我的OBjects中高效地存储数据?我考虑使用两个QList,一个用于时间,另一个用于宝贵数据。然后动态分配两个纯double数组进行动态访问,将指针与长度一起放入结构体中,并通过accessData(pastTime)方法返回。动态内存填充了从“现在”到过去某个点的timeVal/测量值组合,可以通过信号设置。所有易碎物品都由QObject中的互斥体保护。
当丢弃旧值时,QList必须从开头开始搜索第一个年轻到足以保留的值,位于此索引之前的值将被丢弃。QMap是否更聪明,因为它有upperBound()函数?我认为隐藏的开销不值得。
一个专业的程序员如何优雅、高效地解决这个问题?有没有特殊的Qt功能需要了解?或者甚至有免费的解决方案?无论如何,这样一个基本的问题需要这么多的文本...感谢您阅读到这里 ;-)
提前感谢
Marvin
编辑:在stijn的评论后进行了一些整理。