【发布时间】:2010-10-03 03:19:46
【问题描述】:
我正在基于Qwt 为 Qt 开发一个 Gui-Module 来绘制实时测量值,就像在数字示波器中一样。到目前为止一切正常,但也许还有一些功能需要添加;-)
在数据按列存储在 QVectors 中的那一刻,以及一个单独的 QObject 中的一个全局 timeReference QVector。因此,可以逐行丢弃数据,以仅将 Meusurement 保留到某个过去。所有 QVector 总是具有相同的长度。然后可以在 QwtPlot 中按行按时间正确绘制完整数据。
我想更多地封装数据存储,以便更独立地处理测量。因此,最好为每个测量添加一个单独的时间坐标列表,并将它们放在一个单独的 QObject 中,该 QObject 接受和传递数据。然后会有 10 或 20 个这样的 QObject,每个数据通道一个,由 QwtPlot 上的上覆 QObject 单独绘制。
数据现在可以是动态的——数据如何存储、更改或丢弃,外部不可见。
我的问题是:这很聪明吗? 20 或 30 个 QObjects,包含每 10000 个测量值、10000 个时间值,以及一个类似大小(动态填充)的单独内存区域,其中显示数据的子集用于绘图......?将 QObject 中的每个测量值作为信号接收,以 1kHz 左右的频率发射是否合理?信号/槽部分来自于稍后使每个对象成为 QThread 的想法,并实现实时过滤,如对数据的低通或 FFT——因此,信号/槽连接可以方便地控制输出多线程环境?
如何将数据有效地存储在我的对象中?我正在考虑两个 QList,一个用于时间,一个用于宝贵数据。然后动态分配两个普通的双数组以进行动态访问,其指针与长度一起放入一个结构中并由 accessData(pastTime) 方法返回。动态存储器充满了从“现在”到过去某个点的 timeVal/测量组合,可由信号设置。由 QObject 内部的互斥锁保护的一切脆弱。
当丢弃旧值时,必须从头开始搜索 QList 以找到第一个足够年轻的值以保留,并丢弃位于该索引之前的值。 QMap 是否因为它的 upperBound() 函数而更智能?我认为隐藏的开销不值得。
专业人士将如何尝试巧妙、高效或轻松地解决此问题?我应该知道的特殊 Qt 功能?或者甚至有免费的解决方案吗?无论如何,对于这样一个基本问题,有很多文字......感谢您阅读这里;-)
提前致谢
马文
edith:在 stijns cmets 之后对论证进行了一些清理。
【问题讨论】:
-
不完全理解这个问题:为什么要在 QObject 中进行测量?并为时间坐标保留一个额外的 QObject?两者都是静态数据,所以我不明白你为什么要将信号/插槽连接到它们,而且对我来说听起来很奇怪,你想要一个与时间分开的测量。您能否更详细地解释/提供一个示例,说明您将如何处理此类对象上的信号?
-
无论如何,我过去在半实时绘图和 QwtPlot 方面有一些经验。让这个为我们工作的最方便的方法是生产者/消费者场景。简而言之,生产者线程从 ADC 读取数据并进行一些处理,然后将数据包放入循环缓冲区中。消费者线程从缓冲区读取大块,决定如何处理它,切断信号并传递给 QwtPlot。请注意,所有数据采集、缓冲、处理都是在没有 Qt 的情况下编写的:它实际上没有现成的类型来存储 2D 数据或与音频硬件通信,因此这些都是仅使用 C++ 自制的。
-
嗯,不——我想将一种类型的所有测量值与所有记录时间一起放入一个子类/对象中,但隐藏这种复杂性。启用异步录制、实时内容等等...
标签: c++ user-interface qt