Qt: Лучший способ реализовать построение графиков в реальном времени «как у осциллографа»

Я работаю над Gui-модулем для Qt, чтобы отображать измерения в реальном времени, как в цифровом осциллографе, на основе Qwt . Пока все работает так, как должно, но, возможно, еще остались некоторые функции, которые нужно добавить; -)

В настоящий момент данные хранятся по столбцам в QVectors вместе с одним глобальным QVector timeReference в одном отдельном QObject. Таким образом, данные можно отбрасывать построчно, чтобы сохранить только Meusurement до определенного прошлого. Все QVectors всегда имеют одинаковую длину. Затем полные данные могут быть построены по строкам с правильным временем в QwtPlot.

Я хочу больше инкапсулировать хранилище данных, чтобы быть более независимым при работе с измерениями. Поэтому было бы неплохо добавить отдельный список временных координат для каждого измерения и поместить их в отдельный QObject, который принимает и доставляет данные. Тогда будет 10 или 20 таких QObject, по одному на каждый канал данных, которые отдельно нанесены вышележащим QObject на QwtPlot.

Теперь данные могут быть динамически какими угодно - как данные хранятся, измененные или выброшенные между ними не должны быть видны снаружи.

Мой вопрос: это умно? 20 или 30 QObjects, содержащих каждые 10000 измерений, 10000 значений времени, плюс отдельная область памяти аналогичного размера (динамически заполняемая), где подмножество данных представлено для построения графика ...? Разумно ли получать каждое измерение в своем QObject в качестве сигнала с частотой около 1 кГц? Часть сигнал / слот исходит из идеи сделать каждый объект QThread позже и реализовать фильтрацию в реальном времени, такую ​​как нижний проход или БПФ для данных, поэтому соединения сигнал / слот удобны для управления выводом в многопоточная среда?

Как можно эффективно хранить данные внутри моих объектов? Я думаю о двух QList, один для времени и один для ценных данных. Затем выделение двух простых двойных массивов на лету для динамического доступа, указатели которых вместе с длиной помещаются в структуру и возвращаются методом accessData (pastTime). Динамическая память заполняется комбинациями timeVal / измерения от «сейчас» до определенной точки в прошлом, задаваемой сигналом. Все хрупкое защищено мьютексами внутри QObject.

При отбрасывании старых значений в QList нужно с самого начала искать первое значение, которое достаточно молодое, чтобы его можно было сохранить, а те, которые находились до этого индекса, отбрасываются. QMap умнее из-за своей функции upperBound ()? Я полагаю, что скрытые накладные расходы того не стоят.

Как можно попытаться решить эту проблему красиво, эффективно или без каких-либо хлопот? Особые возможности Qt, о которых я должен знать? Или есть даже бесплатные решения? Во всяком случае, много текста для такого основного вопроса ... Спасибо, что дочитали до этого места; -)

Заранее спасибо

Марвин

edith: немного поправил аргументацию после комментариев stijns.

6
задан marvin2k 3 October 2010 в 12:23
поделиться