Qt:实现"类似示波器"的实时绘图的最佳方式

mar*_*n2k 6 c++ user-interface qt

我正在研究用于Qt的Gui-Module来绘制基于Qwt的数字示波器中的实时测量.到目前为止一切都可以,但也许还有一些功能需要添加;-)

目前,数据在QVectors中按列存储,并在一个单独的QObject中与一个全局timeReference QVector一起存储.因此,可以逐行丢弃数据,以便仅将Meusurement保持到某个过去.所有QVectors总是具有相同的长度.然后,可以在QwtPlot中按时间正确地绘制完整数据.

我想更多地封装数据存储,以便更加独立于测量.因此,为每个测量添加一个单独的时间坐标列表并将它们放在一个单独的QObject中是很好的,它接受和传递数据.然后将有10或20个这样的QObject,每个数据通道一个,它们由QwtPlot上的上覆QObject单独绘制.

现在,数据可以是动态的 - 无论外部是否可以看到数据在两者之间的存储,更改或丢弃方式.

我的问题是:这很聪明吗?20或30个QObjects包含每10000个测量值,10000个时间值,加上一个相似大小的单独存储区域(动态填充),其中一个子集ob数据被提供用于绘图...?将QObject中的每个测量值作为信号接收是否合理,在1kHz左右发射?信号/槽-一部分来自制造的想法每后面的对象一个的QThread,并执行实时过滤,像上的数据低通或FFT - 因此,信号/槽连接是方便的CONTROLL输出在多线程环境?

如何在我的OBjects中有效存储数据?我正在考虑两个QList,一个用于时间,一个用于珍贵数据.然后动态分配两个普通的双数组用于动态访问,其指针与长度一起放在结构中并由accessData(pastTime)方法返回.动态存储器由从"现在"到过去的某个点的timeVal /测量组合填充,可由信号设置.QObject中的互斥体保护的所有东西都很脆弱.

当丢弃旧值时,必须从头开始搜索QList,以获得足够年轻的第一个值,保留在该索引之前的那个值.由于其upperBound()函数,QMap是否更智能?我认为隐藏的开销不值得.

一个专业人员将如何很好地,有效地或没有任何麻烦地尝试解决这个问题?我应该知道的特殊Qt功能?或者甚至是那里的免费解决方案?无论如何,这样一个基本问题的文字很多......感谢您在这里阅读;-)

提前致谢

马文

edith:在stijns评论之后做了一些清理.

sti*_*ijn 6

photo_tom的答案几乎总结了一下:我远离QObjects来实现数据处理和处理.

  • 如果你决定为你的gui使用除Qt以外的其他东西,你将难以重构代码.像QList和QVector这样的类可以被STL对应物替换而没有太多问题,但是信号/插槽部分是其他的.
  • 对于像filter/fft这样的信号处理的任何第三部分实现都可能采用1D或2D数据的原始指针,所以你必须从QVector中获取那些我甚至不确定是可能的.如果不是,则必须将每个样本从QVector中取出并将其复制到内存块,然后进行处理,然后将其放回QVector中.
  • 这让我们得到你关于QList/QMap的问题:它可以用它们中的任何一个来完成,但它们实际上被设计为具有随机访问迭代器的动态容器,而你有大量固定大小的内存来保存2D数据.可能值得研究一个完全满足您需求的自定义数据容器类.拿一篇论文,写下你真正需要的东西,清除你的想法,忘记Qt/STL/......然后考虑你需要实现这些的组件,然后再考虑如何实现这些组件(最终在Qt方面).
  • 对于像这样的代码,最好不要重新分配.预先设置最大历史记录的限制和您要允许的样本数量(或使其成为配置设置),并在程序开始时分配所需的数组,进一步重用相同的内存.
  • 考虑一个循环缓冲区.当数据以不同的速率进入时(数据获取大多数情况下)很方便,它不需要重新分配,它会自动保存历史记录,如果读取/可以使用最少量的内存副本实现write方法直接返回指向底层内存的指针.
  • 也许重新考虑你的线程想法,它可能会使你的代码变得不必要地复杂化:最后,来自不同通道的所有数据必须同时进入屏幕.如果用户在时间x看到来自通道1的数据,则来自通道2的数据也必须来自时间x,否则它作为范围没有多大意义.但是假设您在不同线程中处理来自这些通道的数据,则需要在执行实际显示的线程中进行额外同步,因为并非所有数据线程都会在时间x同时完成块的处理.除此之外,考虑到可能没有任何性能增益:如果cpu必须计算30个通道的FFT和100%的剪辑,如果它们分成30个线程,它真的会更快地计算这些FFT吗?
  • 顺便说一下,这是一个基本问题,我认为实际上并非如此.我已经为不同的设备上的数据采集/处理/可视化/保存做了很多应用程序,我认为他最难开发的那些应用程序.