Qt: Der beste Weg, um ein Echtzeit-Plotten nach Art eines Oszilloskops zu implementieren

Ich arbeite an einem Gui-Modul für Qt, um Echtzeitmessungen wie in einem digitalen Oszilloskop zu zeichnen, basierend auf Qwt. Alles funktioniert soweit wie es sollte, aber vielleicht gibt es noch ein paar Features hinzuzufügen ;-)

Im Moment werden die Daten spaltenweise in QVectors zusammen mit einem globalen timeReference QVector in einem separaten QObject gespeichert. So können die Daten zeilenweise verworfen werden, um nur die Messung bis zu einer bestimmten Vergangenheit aufrechtzuerhalten. Alle QVectors haben immer die gleiche Länge. Die vollständigen Daten können dann zeilenweise und zeitrichtig in einem QwtPlot aufgezeichnet werden.

Ich möchte den Datenspeicher besser kapseln, um unabhängiger mit den Messungen arbeiten zu können. Daher wäre es schön, für jede Messung eine separate Liste von Zeitkoordinaten hinzuzufügen und beide in einem separaten QObject abzulegen, das die Daten akzeptiert und liefert. Dann gäbe es 10 oder 20 solcher QObjects, eines für jeden Datenkanal, die separat von einem darüberliegenden QObject auf dem QWT-Plot gezeichnet werden.

Die Daten können jetzt dynamisch sein - wie die Daten zwischengespeichert, geändert oder verworfen werden, sollte nach außen nicht sichtbar sein.

Meine Frage ist: Ist das klug? 20 oder 30 QObjects mit jeweils 10000 Messungen, 10000 Zeitwerten und einem separaten Speicherbereich ähnlicher Größe (dynamisch gefüllt), in dem eine Teilmenge der Daten zum Plotten angezeigt wird ...? Ist es vernünftig, jede Messung in ihrem QObject als Signal zu empfangen, das mit etwa 1 kHz ausgelöst wird? Der Signal / Slot-Teil stammt aus der Idee, jedes OBject später zu einem QThread zu machen und eine Echtzeitfilterung wie Tiefpass oder FFT für die Daten zu implementieren. Daher sind Signal / Slot-Verbindungen praktisch, um die Ausgabe in einem zu steuern Multithread-Umgebung?

Wie können die Daten in meinen OBjects effizient gespeichert werden? Ich denke an zwei QList, eine für Zeit und eine für wertvolle Daten. Anschließend werden zwei einfache Doppelarrays für den dynamischen Zugriff direkt zugewiesen, deren Zeiger zusammen mit der Länge in eine Struktur eingefügt und von einer accessData-Methode (pastTime) zurückgegeben werden. Der dynamische Speicher wird von "jetzt" bis zu einem bestimmten Zeitpunkt in der Vergangenheit mit den Kombinationen aus Zeitwert und Messung gefüllt, die durch ein Signal eingestellt werden können. Alles, was durch Mutexe im QObject zerbrechlich ist.

Wenn alte Werte verworfen werden, muss die QList von Anfang an nach dem ersten Wert durchsucht werden, der jung genug ist, um beibehalten zu werden. Die Werte, die sich vor diesem Index befinden, werden verworfen. Ist eine QMap aufgrund ihrer upperBound () - Funktion intelligenter? Ich denke, dass sich der versteckte Aufwand nicht lohnen würde.

Wie würde ein Profi versuchen, dieses Problem nett, effizient oder problemlos zu lösen? Spezielle Qt-Features, über die ich Bescheid wissen sollte? Oder gibt es überhaupt kostenlose Lösungen? Jedenfalls viel Text für so eine Grundfrage ... Danke fürs Vorlesen ;-)

Danke im Vorau

Marvin

edith: Nach stijns Kommentaren wurden einige Argumentationsbereinigungen durchgeführt.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage