我正在研究用于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左右发射?信号/插槽部分来自于稍后将每个OBject作为QThread的想法,并实现实时滤波,如数据上的低通或FFT - 因此,信号/插槽连接可以方便地控制输出。多线程环境?
如何在我的OBjects中有效存储数据?我正在考虑两个QList,一个用于时间,一个用于珍贵数据。然后动态分配两个普通的双数组用于动态访问,其指针与长度一起放在结构中并由accessData(pastTime)方法返回。动态存储器充满timeVal /测量组合,从“now”到过去的某个点,可由信号设置。在QObject中由互斥体保护的所有东西都很脆弱。
当丢弃旧值时,必须从头开始搜索QList,以获得足够年轻的第一个值,保留在该索引之前的那个值。由于其upperBound()函数,QMap是否更智能?我认为隐藏的开销不值得。
如何能够很好地,有效地解决这个问题或者没有任何麻烦?我应该知道的特殊Qt功能?或者甚至是那里的免费解决方案?无论如何,这个基本问题的文字很多......感谢您在这里阅读; - )
提前致谢
马文
edith:在stijns评论之后做了一些论证清理。答案 0 :(得分:6)
photo_tom的答案几乎总结了:我远离QObjects来实现数据处理和处理。
答案 1 :(得分:3)
QObjects乍一看似乎是处理此类数据存储问题的绝佳方法。当我第一次开始使用Qt时,我也想到了同样的事情。但是,这不是它们的用途。关于QObjects在http://www.informit.com/articles/article.aspx?p=667415真正做什么和做什么都有很好的写作。
如果您要做的就是将数据存储在类中,当我阅读您的问题时,请不要使用基于QObject的类。开销会严重影响您的表现。
至于Qt的具体功能对你有什么帮助,Qt没有什么特别的帮助。我发现Qt的容器比标准模板库或者一些专业的容器更容易使用,因为当时我还不太了解它。
从性能的角度来看,我最好的建议是通过编写内存池系统来最小化新/删除数量,或者对每个新读数使用Boost Pool。并且最小化移动数据。