2013-10-18 8 views
5

Ich habe folgendes Szenario im Hinterkopf:WPF Echtzeit-Diagramm-Anwendung Architektur

Ich möchte (über die serielle Schnittstelle) einige Befehle an ein Gerät senden. Dieses Gerät sendet mir einen kontinuierlichen Datenstrom zurück (max. 12000 Werte pro Sekunde).

Um einige Einstellungen zu steuern, brauche ich einige Tasten, um Befehle an das Gerät zu senden, um Einstellungen vor und während des Datenstroms zu starten/zu stoppen/zu ändern. Ich möchte auch eine Echtzeit-Darstellung dieser Daten haben. Ich werde diese Daten natürlich filtern. Auch bei bestimmten Zeitstempeln gibt es ein Signal, das anzeigt, dass ich ein bestimmtes Fenster der empfangenen Daten ausschneiden möchte.

Das bedeutet, ich werde zwei Diagramme haben. Ich habe mit WPF bereits einige Fortschritte gemacht, aber jetzt, wenn ich mit dem unteren Diagramm interagiere (zoome/schwenken), friert das obere ein, was sich bemerkbar macht. Dies liegt daran, dass beide sehr oft aufgefrischt werden müssen!

Arbeit (Datenempfang/Filterung) wird mit Threads durchgeführt, aber die Aktualisierung des Plots muss innerhalb des ui-Threads erfolgen.

Irgendwelche Ideen, wie man dieses Problem löst? Vielleicht mehrere Prozesse verwenden?

enter image description here

Antwort

1

Ich mache eine ähnliche WPF-Anwendung mit Echtzeit-Wellenformen (etwa 500 Hz). Ich habe Hintergrundthreads, die Echtzeitdaten empfangen, separate Threads, um sie zu verarbeiten und die Daten für das Zeichnen vorzubereiten (Ich habe einen Puffer mit der "Größe" des Bildschirms, wo ich die vorbereiteten Werte ablege). Im UI-Thread zeichne ich die Wellenformen auf die RenderTargetBitmap, die am Ende auf Canvas gerendert wird. Diese Technik erlaubt mir, eine Vielzahl von Echtzeit-Wellenformen auf dem Bildschirm zu haben und Zoom und Pan ohne Probleme arbeiten zu lassen (ca. 40-50 fps).

Bitte lassen Sie mich wissen, wenn Sie einige technische Details benötigen, kann ich sie später mit Ihnen teilen.

Ich denke, Sie haben etwas Code im UI-Thread, der nicht gut optimiert ist oder in den Hintergrund Thread verschoben werden kann.

Btw, verwenden Sie ein Framework für Diagramme?

bearbeiten

philologon ist richtig, Sie Rx für Echtzeitdaten verwenden soll, vereinfacht Code A LOT. Ich benutze sie auch in meinem Projekt.

+0

Ich benutze oxyplot. Das einzige, was ich innerhalb des UI-Threads tue, ist, dem Plot Werte zu geben und es zu aktualisieren. Soweit ich weiß, muss dies im UI-Thread geschehen. Auch wenn ich die Plots nicht aktualisiere, bekomme ich hohe fps. Hast du ein Beispiel, wie du deine Wellen zeichnest? Vielleicht gibt mir das schon einen Hinweis, wie man die Dinge besser machen kann. – user2799180

+0

Sicher werde ich morgen einige Beispiele teilen. Soweit ich weiß (und ich habe eine kleine Untersuchung in diesem Bereich gemacht), ist Oxyplot nicht sehr gut für Echtzeitdaten. Tatsächlich haben Sie nicht sehr viel Auswahl. http://dynamicdatadisplay.codeplex.com/ (http://d3future.codeplex.com/) ist gut, aber sehr veraltet. Ich würde es nicht im realen Projekt verwenden, aber für die Untersuchungen ist es sehr gut. Sie können [Direct 2D] (http://blog.rthand.com/post/2012/01/10/Realtime-graph-for-WPF.aspx) verwenden. Und du renderst Charts immer selbst, was ich mache. – MrZoidberg

+0

Ich habe auch eine Untersuchung gemacht. Ich habe dynamicdatadisplay gefunden, aber es ist wirklich nicht auf dem neuesten Stand. Ich werde Rx und Direct 2D anschauen. Obwohl ich wirklich an Ihrer RenderTargetBitmap-Methode interessiert wäre. Ich habe schon darüber gelesen, aber nie ein gutes Beispiel gefunden. Das wäre wirklich toll. Das Empfangen und Verarbeiten mache ich auch in verschiedenen Threads. Danke vielmals! – user2799180

1

Es ist ein kommerzielles Produkt, aber es gibt ein Echtzeit-WPF-Diagramm, das mit diesem Anwendungsfall umgehen kann und dann einige.Bitte werfen Sie einen Blick auf das Tutorial unter:

http://www.scichart.com/synchronizing-chartmodifier-mouse-events-across-charts/

enter image description here

Es ist eine Live-Silverlight Demo dieses Verhalten hier:

Sync Multichart Mouse Silverlight Demo

Und das Diagramm sollte in der Lage sein das Zoomen bei der Eingabe von Werten mit hoher Geschwindigkeit:

Realtime Performance Demo

Disclosure: Ich bin der Besitzer und Tech-Führung von SciChart