Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
Hallo zusammen,
Ich hab ein UI mit ca. 150 Anzeigeelementen die möglichst 2 mal die Sekunde geupdatet werden sollten. Durch das Update der Werte ensteht für diese kurze Zeit eine hohe CPU Auslastung. Ich hatte vor diesen Ausschlag zu glätten und die Anzeigeelemente nacheinander dauerhaft zu updaten.
Das Problem ist nun, dass ich nicht weiß, wie ich die einzelnen Elemente updaten kann, da sie sich als Array in einem Cluster befinden. Wenn ich nun diesem Cluster einen Wert zuweise werden sofort alle Elemente geupdatet. Wie kann ich auf ein einzelnes Element des Ausgabeclusters zugreifen? Ich hatte mir schon überlegt, ob ich nicht eine Referenz auf ein Element innerhalb des Arrays innerhalb des clusters erhalten kann. Ich bin aber mit dem Ansatz nicht so weit gekommen : /
LabView 8.6
13.01.2011, 20:15 (Dieser Beitrag wurde zuletzt bearbeitet: 13.01.2011 20:15 von schrotti.)
Das VI hab ich jetzt nicht griffbereit. Ich habe aber identifiziert, dass die CPU Auslastung ausschließlich aus der Oberfläche kommt. Das heißt, wenn ich zum Beispiel den Teil, bei dem die Daten in das cluster der Oberfläche kopiert werden nur jede Sekunde ausführe, kriege ich jede Sekunde einen Peak von 30% bis 40% CPU Last. Dabei muss man sagen, dass es sich hierbei um einen P4 1.8GHz handelt.
14.01.2011, 08:20 (Dieser Beitrag wurde zuletzt bearbeitet: 14.01.2011 10:52 von Lucki.)
' schrieb:Das Problem ist nun, dass ich nicht weiß, wie ich die einzelnen Elemente updaten kann, da sie sich als Array in einem Cluster befinden.
Zu diesem Teil Deiner Frage: Auf dem Frontpanel mit rechter Maustaste auf das Element im Cluster klicken und Eigenschaftsknoten "Wert" erstellen:
Leider nur sind Eigenschaftknoten viel langsamer als lokale Variable oder die Elemente selbst. Aber probieren geht über studieren.
' schrieb:Warum soll denn der Peak geglättet werden?
Lass mich mitraten. Mein Tipp ist:
Es sollen 10 Anzeigeelemente nicht alle zugleich alle 0.5sec aktualisiert werden, sondern alle 50 ms eines, bis alle 10 durch sind.
Das Dumme ist, daß der Begriff "glätten" anderweitig fest belegt ist. Von "glätten" sollte man in diesem Kontext nicht sprechen. Damit sind Missverständnisse vorprogrammiert. Man ist aber hier in Bezug auf Sprachverhunzung im allgemeinen und skurrile Terminologie im Besonderen einiges gewohnt, so daß das schon gar nicht mehr auffällt.
Anzeige
14.01.2011, 16:06 (Dieser Beitrag wurde zuletzt bearbeitet: 17.01.2011 00:10 von unicorn.)
@Lucki
Habe ich genauso verstanden, wie Du es beschrieben hast.
Anders formuliert:
Warum sollen die Anzeigeelemente nicht auf einmal aktualisiert werden? Nur damit der Peak im Verlauf der CPU-Auslastung verschwindet oder gibt es dafür noch andere Gründe?
Schließlich verschwindet der Peak in der CPU-Auslastung auch vom Bildschirm, wenn man den Taskmanager schließt.
Und was ist, wenn der Code zum Verteilen der Aktualisierung zusätzliche CPU-Leistung benötigt?
Ich sehe da noch kein Problem in dem Peak.
15.01.2011, 11:02 (Dieser Beitrag wurde zuletzt bearbeitet: 15.01.2011 12:45 von BNT.)
wenn viele Indikatoren/Controls mit Hilfe von Eigenschaftsknoten aktualisiert werden sollen, sollte die Frontpanel-Aktulisierung verzögert werden.
1. Eigenschaftsknoten mit Klasse VI auf das Blockdiagramm, die Eigenschaft Panel auswählen.
2. Die Panel-Referenz an einen weiteren Eigenschaftsknoten verdrahten und die Eigenschaft DeferPanUpdts selektieren und auf True setzen.
3. Nach der Aktualisierung der Controls/Indikatoren DeferPanUpdts wieder auf False setzen.
Damit wird die Zahl der Thread-Wechsel zwischen GUI und Blockdiagram auf ein Minimum reduziert.
Das direkte Schreiben auf Indikatoren wird, wenn man es nicht absichtlich anders konfiguriert hat, von LabVIEW asynchron durchgeführt, und stellt normalerweise kein Performance Problem dar.
Gruß Holger
Sorry, wegen des Fehlers im VI-Snippet. Ich hab's korrigiert.
' schrieb:Damit wird die Zahl der Thread-Wechsel zwischen GUI und Blockdiagram auf ein Minimum reduziert.
Der umgekehrte Weg, das ganze VI oder ganze Teile der Applikation in den UI-Thread zu legen bringt mitunter auch eine spürbare Entlastung bzw. verminderte den Threadwechsel.