Fragen zu QWT

Alles rund um die Programmierung mit Qt
Antworten
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Fragen zu QWT

Beitrag von reinki0013 »

Hallo zusammen!

ich soll jetzt eine art "datenerfassung" bzw. "datenaufzeichnung" mit qt realisieren...

das ganze soll ungefähr so ablaufen:
es werden in echtzeit daten empfangen und diese soll ich dann grafisch darstellen...
in form von diagrammen, wo man eben alle möglich werte sieht...
praktisch in ein diagramm linien zeichnen in echtzeit...
kann ich das ganze mit QWT realisieren?

hat so ein ähnliches projekt schon mal wer umgesetzt?
kann mir da jemand vielleicht auf die sprünge helfen?

weil meines wissen nach kann man das ja nur mit qwt...
im qt gibt es ja nichts ähnliches, oder?

wäre toll wenn ihr mir eure meinung dazu sagt...

danke im voraus

lg :roll:
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Beitrag von -=Freaky=- »

ich wuesste auch keine einfache(re) alternative, die auf qt basiert, aber mit qwt (speziell vllt. QwtPlot/QwtPlotCurve) sollte das wohl gut machbar sein.
(ohne gewaehr, in echtzeit gezeichnet habe ich selbst noch nicht ;))

mfg,
julian
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Das problem ist, das das Thema ned trivial ist, und fuer eindeutige aussagen uns bissi paar randbedingungen fehlen ....

Wir messen hier auch daten, und visualisieren sie. Haben aber nen eigene entwicklung fuer die Darstellung (aehnlich wie nen diagramm). die QWT war uns zu unflexibel, unsere Anforderungen zu speziell ....

Wenn du alles im speicher halten kannst, isses ziemlich einfach. willst du nen Osszilloskop emulieren, also immer nen gleichgrosses fenster in die vergangenheit anzeigen, und was drueber hinaus ist, faellt weg, wirds nur kleinwenig komplizierter.
willst aber dynamisch die bereiche anpassen, und ned alles passt in den speicher, sowei dann automatisches ausduennen der daten, bzw ersetzen durch statistische werte, da kannst unendlich viel Aufwand reinstecken, und deine Anzeige iss das wenigste Problem.

Also nimm die QWT, entwickel ne erste version mit dem diagramm view, am besten schoen abgekapselt und abstrahiert (Schnittstelle) und wenns ned passt, ersetzt das dann halt spaeter, durch ne eigenimpl oder was anderes.

Gibt uebrigens viele so datenviews verlaufsanzeigen etc auf com basis. die kann man ueber activeQT(commerzielle version glaub ich) relativ einfach einbinden. Aber ueberzeugt hat mich das ned, und com iss scho bissi nen overhaed ... und die plattformunabhaengigkeit verabschiedet sich auch meist ....
Ich wuerd definitiv QWT als erstes versuchen ...

Ciao ...
Uwe
Beiträge: 176
Registriert: 9. Oktober 2005 13:37
Wohnort: München

Beitrag von Uwe »

Wenn es darum geht Diagramme mit Qt in "Echtzeit" zu aktualisieren gibt es leider ein prinzipielles Problem: Qt.
Qt4 wurde darauf ausgerichtet die Effekte moderner Desktops ( z.B. Transparenz ) zu unterstützen. Die dafür erforderliche Grafikpipeline kostet nicht nur Zeit sondern verhindert zudem Techniken, die für inkrementelles Zeichnen und Löschen von Werten erforderlich sind.

Zunächst einmal solltest Du daher ermitteln, ob Du mit Qt4 schnell genug zeichnen kannst. Wenn ja prima - wenn nein mußt Du versuchen "gegen" Qt vorzugehen:

a) Zeichnen

Die Möglichkeiten an der Grafikpipeline vorbei, direkt auf das Widget zeichnen zu können sind leider plattformabhängig. Unter X11 kommst Du mit Qt::WA_PaintOnScreen und Qt::WA_PaintOutsidePaintEvent zu sehr guten Ergebnissen. Unter Windows mußt Du schon mehr tricksen und dem Widget ein Paint Event schicken und es abfangen um zeichnen zu können. Auf dem Mac ist dagegen nicht viel möglich ausser in ein QPixmap zu malen, daß dann aber vollständig neugezeichnet werden muß.

b) Löschen

Im XOR Mode löscht das Wiederholen einer Zeichenoperation die vorhergehende. Damit kann man vermeiden, daß man das Diagramm komplett neuzeichnen muß um eine Linie zu löschen. XOR mode gehört zu den Raster Operationen, die unter Qt3 noch verfügbar waren allerdings von Qt4 nicht mehr unterstützt werden. Ich habe in Erinnerung, daß im ChangeLog von Qt 4.5 erwähnt ist, daß Raster Operationen wieder möglich sind - ob der XOR Mode darin enthalten ist habe ich noch nicht überprüft.

Zu Qwt:

Qwt bietet Dir ein Framework zum Zeichnen von Diagrammen. Es stellt Dir ein Koordinatensystem zur Verfügung auf das Du Zeichnen kannst. Du kannst das Zeichnen vollständig selber übernehmen ( = eigene plot items implementieren ) oder auf einen Satz von Standarditems ( Kurven, Marker, Spektrogram ... ) zurückgreifen bzw. durch Überladen/Parametrisieren individuell gestalten. Im Gegensatz zu RHBaum behaupte ich, daß Qwt ausgesprochen flexibel ist - das Problem ist eher die mangelhafte Dokumentation, die es schwierig macht den passenden Dreh zu finden. Ich empfehle die Qwt Foren/Mailinglisten zu lesen und sich nicht scheuen in den Code zu schauen um rauszufinden wo Du Dich reinhängen kannst.

Um zu überprüfen was mit Qwt möglich ist, schau Die einfach die enthaltenen Beispiele an. Mit dem data_plot Beispiel kannst Du überprüfen, was auf dem von Qt vorgesehen Weg möglich ist ( verändere die Anzahl der Punkte um Deinen Anforderungen besser zu entsprechen ). Das realtime Beispiel dagegen zeigt wie man inkrementell zeichnen kann.

Ich bin gerade dabei das Programmieren von "Echtzeit" Diagrammen mit Qwt zu überarbeiten. Im Gegensatz zu Qwt 5.2 versuche ich nicht mehr die optimale Strategie für die Kombination aus Plattform und Qt Version intern zu wählen, sondern will sie dem Anwender explizit zur Verfügung stellen. Die Implementierung ist noch nicht vollständig und nur unter X11 getestet, aber vielleicht hilft Dir das neue Beispiel "oscilloscope" aus dem Qwt SVN repository (trunk) weiter.

Uwe
reinki0013
Beiträge: 174
Registriert: 11. November 2008 09:37
Wohnort: AUT

Beitrag von reinki0013 »

hallo,

besten dank mal an alle...
super das ihr mir eure meinungen gesagt habt...

ich werd mich, sobald ich loslege, informieren wie ich es angehe...

besten dank

lg
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Sorry, für vielleicht bissi OT:

@Uwe
Was verstehst du unter "Echtzeit" im Zusammenhang mit Diagrammen die aufn computer dargestellt werden ?

Meiner Meinung nach beissen sich die begriffe Echtzeit und Diagramme im im selben Kontext ein bisserl.
Nen Diagramm ist fuer das menschliche Auge bestimmt, richtig ? Und das Auge hat physikalische Parameter die alles andere als optimal sind. so nimmt man geringe verzoegerungen erst gar ned wahr, und Aenderungen werden auch erst ab bestimmten schwellwerten erkannt.

Wie Echtzeitfaehig muessen Diagramme nun sein ? Meiner Meinung nach ist man heutzutage auf modernen Desktops in der Lage, Diagramme genauer und mit weniger verzeogerung darzustellen, als wie das menschliche Auge was mitbekommen wuerde. Auch mit der QT. Naja, man muss nur manchmal tiefer in die trickkiste greifen ....

Wir haben hier z.b. nen fettes Laboroszilloskop, und daneben nen Messplatz mit wandlerkarten und nen softwareosszilloskop.
Das softwareosszi iss sicher ned das performanteste. Da gibts Applikationen die reagieren wesentlich schneller, also denk da iss optimierungspotential vorhanden.
Mit der QT koennt ich mir vorstellen, kann man sowas auch programmieren.

Aber die bilder die die liefern sind die gleichen. Ich muesst wahrscheinlich mit ner hochgeschwindigkeitskamera aufnehmen, um zu sehen um wieviel das softwareosszi hinterherhinkt. mit blossem Auge sieht man zumindest ned viel ....

Ciao ....
Uwe
Beiträge: 176
Registriert: 9. Oktober 2005 13:37
Wohnort: München

Beitrag von Uwe »

RHBaum hat geschrieben:Was verstehst du unter "Echtzeit" im Zusammenhang mit Diagrammen die aufn computer dargestellt werden ?
Bei Anfragen bzgl. Qwt und "Echtzeit" geht es in der Regel eigentlich immer darum, dass periodisch eintreffende Daten möglichst unmittelbar dargestellt werden sollen. Dabei sollte das Zeichnen schnell genug gehen ( was das bedeutet muss man im Einzelfall entscheiden ) + eine fluessige Darstellung ermöglichen und möglichst ohne 100% CPU Last auskommen.

Es geht eigentlich weniger um das Einhalten von Mikrosekunden als vielmehr, dass man viele Updates pro Sekunde braucht und schnell genug sein will um ohne Cachen (was bei nicht inkrementellem Zeichnen nur bedingt geht) die eintreffenden Daten zeichnen zu können.

Uwe
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ja da is die frage wie periodisch die daten ankommen

es macht keinen sinn, daten die 30mal pro sekunde kommen, auch fuers auge 30mal pro sekunde zu zeichnen

Normal langt es aus wenn man update intervalle von 500ms hat.
Und Daten zu zeichen und da mehr wie 500ms zu verheizen faellt scho schwer, so komplexe dinge sind mir auch noch ned untergekommen, bzw liessen sich recht schnell "vereinfachen" .

Unter Echtzeit verstehen wir hier auch bissi was anderes. Wahrscheinlich deshalb hab ich deine definition falsch gedeutet.
Imho gibt es kein PC basierendes BS, wo der Grafikteil im Echtzeitbereich laueft. der laeuft immer im dynamischen teil ... das heisst wirklich echtzeitfaehige grafik sollt es ned geben. macht aber auch ned wirklich nen sinn ...
Vielleicht gibts bei den Controller und hardwaereloesungen was im video und bildbearbeitungssector, wo die grafik rein von der hardware kommt. Aber da wird man eh komplett anders programmieren.

Ciao ...
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

den begriff echtzeit gibt es doch gar nicht. alle rechenoperationen sind zeitverschoben und diagramme in sowas wie echtzeit zu rendern macht keinen sinn zumindest in 99% der mir bekannten fälle.
alelrdings verstehe ich jetzt das problem auch nicht. alles was du tun musst ist die werte zwischenzuspeichern, oder auch nicht. und dann einen graphen zeichnen und die daten dort auftragen. dass sind evtl 500 zeilen code wenns hoch kommt. oder du benutzt spezielle libs mit fertigen graphen. ich glaube es gibt sogar programme dafür, manche im lehrstuhl haben einfach nen script geschrieben, dass sowas erledigt.
erpheus
Beiträge: 46
Registriert: 18. November 2008 11:55
Wohnort: Stuttgart

Beitrag von erpheus »

Bei Anfragen bzgl. Qwt und "Echtzeit" geht es in der Regel eigentlich immer darum, dass periodisch eintreffende Daten möglichst unmittelbar dargestellt werden sollen.
jup genau darum geht es.
Man stellt sich zum Beispiel vor so um die 10 Funktionskurven, die alle 5 bis 20 ms neue zusätzliche Werte bekommen.
Also nach 1s bereits 50 bis 200 neue Wertepaare besitzen.
Selbstverständlich führt man einen replot der kurven z.B. nur alle 500 ms durch und oder versucht hier und da zu drehen.

Trotzdem kommt es irgendwann dazu, dass entweder der Replotintervall zu groß wird oder eine 30s Messung 60s in der Darstellung braucht. -->D.h. Echtzeit nicht erfüllt.

@Uwe
Ich bin sehr gespannt auf deine Überarbeitung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Man stellt sich zum Beispiel vor so um die 10 Funktionskurven, die alle 5 bis 20 ms neue zusätzliche Werte bekommen.
Trotzdem kommt es irgendwann dazu, dass entweder der Replotintervall zu groß wird oder eine 30s Messung 60s in der Darstellung braucht.
du hasst 10 funktionen, jede funktion kriegt aller 5ms nen neuen wert, also sprich 100 in 500ms ....
insgesamt fügst um die 1000 punkte pro 500ms ins diagramm ein. Ich denk mal damit sollt auch die QWT ohne Probleme glarkommen. Macht eh nur Sinn, wenn man nen recht kurzen abschnitt aus der vergangenheit anzeigt, so osszi maessig. Ansonsten muss man die daten eh ausduennen vorm anzeigen, sonst schiebt man sich in den internen listen, die die qwt sicher auch verwendet, allein schon tot und der hauptspeicher explodiert ^^

wie gesagt bei ner diagrammanzeige isses mir auch noch ned vorgekommen, das nen Control wegens der performance ausgeschieden ist. Probelem ist da eher das vorbereiten und cachen der daten ....

Ciao ...
slash-ex
Beiträge: 239
Registriert: 30. März 2005 21:40

Beitrag von slash-ex »

warum threaded ihr nicht. einer zum einfangen der daten, was auf jedenfall in echtzeit abgehandelt wird und einer zum rendern alle 500 ms oder so schnell es halt geht. wobei es vollkommen egal ist, ob der renderer 500ms schafft oder nicht. weil die daten im schlimmsten nur zeitverzögert gerendert aber nicht unbedingt abgehandelt werden. falls das doch ein problem ist, kann man eine zeitmessung durchführen und damit den renderer anpassen.
erpheus
Beiträge: 46
Registriert: 18. November 2008 11:55
Wohnort: Stuttgart

Beitrag von erpheus »

Ich denk mal damit sollt auch die QWT ohne Probleme glarkommen.
Im wesentlichen hast Du damit bereits recht. Qwt kommt damit klar
Ansonsten muss man die daten eh ausduennen vorm anzeigen, sonst schiebt man sich in den internen listen, die die qwt sicher auch verwendet, allein schon tot und der hauptspeicher explodiert ^^
Tja und da liegt der Hund begraben.
Klar musst Du die Daten vorbereiten, also ausdünnen cachen usw. Aber irgendwann kommst Du an den Punkt wo Datenmenge, Ausduennvorgänge und plotten sich die vage halten und die Echtzeitbedingung nicht mehr eingehalten wird.
Und ganz nebenbei hängen hierbei Deine Möglichkeiten vom Anwendungsfall ab.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Tja und da liegt der Hund begraben.
Klar musst Du die Daten vorbereiten, also ausdünnen cachen usw. Aber irgendwann kommst Du an den Punkt wo Datenmenge, Ausduennvorgänge und plotten sich die vage halten und die Echtzeitbedingung nicht mehr eingehalten wird.
Ja genau, aber das ist ja nimmer problem der Anzeige ... sondern da iss Dein Gehirnschmalz gefragt. da werden dir andere controls ned viel abnehmen, oder du hasst control was dann haargenau fuer deinen Fall fuer deine Anwendung die richtige Methode zum reduzieren waehlt. Das die triffst, is eher unwahrscheinlich, Deshalb zeichnen die meisten controls was sie kriegen, und fuers ausduennen bist selber verantwortlich. Die performance vom cachen / ausduennen iss dann aber viel relevanter als das Zeichnen vom Control fuer die performance, womit die poerformance in deiner Hand liegt und ned beim control. Das ist das was ich sagen wollt eigentlich ....
warum threaded ihr nicht.
Komplett anderes thema ! aber bei Faellen wie hier besprochen wuerdest ohne threading eh ned hinkommen. Meist bekommst die Daten eh schon ausm anderen thread ....
Aus der Eventqueue raus pollen und damit
10 Funktionskurven, die alle 5 bis 20 ms neue zusätzliche Werte bekommen.
Also nach 1s bereits 50 bis 200 neue Wertepaare besitzen.
iss vielleicht möglich, erzeugt sicher ne menge last in der eventqeue und iss alles andere als elegant ^^
also multithreading/prozessing seh ich fast schon als vorraussetzung um sowas zu machen.

Ciao ....
erpheus
Beiträge: 46
Registriert: 18. November 2008 11:55
Wohnort: Stuttgart

Beitrag von erpheus »

Probiers doch mal aus.
Siehe das Osziloskop auf das Uwe im svn von Qwt verweist.
Ich arbeite an einem Programm mit unter anderem diesem Problem jetzt schon rund 8 Monate. Hier läuft jetzt alles in Echtzeit. Allerdings ist die Anzahl darstellbarer Kurven begrenzt.

Anderes Thema:
Der Flaschenhals hier ist im Moment das zyklische reploten eines QPixmap. Welches aus einem QBytearray geladen werden muss.
In diesem Anwendungsfall hat dieses nichts mit Qwt zu tun. Zeigt aber, dass der replot-Vorgang von Qt sehr langsam ist für solche Anwendungen.
Und zum "schnellen" zeichnen eines QPixmap gibt es hier schon einige Threads. :?
Antworten