LabVIEWForum.de - PNG zeichnen in Schleife sehr langsam

LabVIEWForum.de

Normale Version: PNG zeichnen in Schleife sehr langsam
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

hoffe ihr könnt mir helfen, hab jetzt schon länger gesucht aber auch hier nichts zu meinem Thema gefunden!

Problem liegt darin, dass ich ein Boolean Array mit den einzelnen Spalten eines 2D Boolean Arrays vergleiche. Wenn eine Spalte übereinstimmt zeichne ich ein Bild (je Spalte ein anderes). Das Problem ist, das sobald ich das serialisiertePixmap.vi in die Schleife einbaue das ganze bis zu mehreren Sekunden dauert. Unzumutbar das man als Benutzer solange warten muss ;D


Ich denke es gibt sicher einen besseren Weg das zu programmieren als wie ich das gemacht habe. Hoffe die Erklärung war nicht zu umständlich, Programm ist angefügt.

Lg Manuel

GrafikTest.vi ladet das 2D Array aus Fahrwege.csv, der Pfad müsste bei euch also aktualisiert werden, ebenso der Pfad für die png dateien.
Wenn du das <= LV2010 abspeicherst schau ich rein.
Hier das ganze für die ältere Version (Labview 8.6), hoffe du kannst mir helfen!

Lg Manuel
Warum zeichnest Du bis zu 40 mal das gleiche Bild in der letzten Schleife?

Hier würde es helfen, wenn nur einmal gezeichnet wird, falls ein TRUE in dem Array ist.

Abgesehen davon sollte das Laden der immer selben Datei auch nicht in der Schleife stecken.

Ansonsten ließen sich noch ein paar Verbesserungen anbringen: Automatisches Indizieren, Intialisierung von "Array" über Initialize Array.vi, Einsatz von logischen Operatoren statt Case-Anweisung.

Die Indizes der Schleifen solltest Du auch noch mal überprüfen.
Danke für die Hinweise,

das zeichnen steckt deshalb in der Schleife weil im richtigen Programm dann für jede Spalte ein eigenes Bild gezeichnet wird, also wenn schaltartikel=wie 1. Spalte von Fahrwege dann 1. bild, wenn =2. Spalte dann 2. Bild, können auch durchaus mehrere gezeichnet werden, habe das nur zum Test vereinfacht.

Deswegen muss das Zeichnen doch in der Schleife stecken, habe keine andere Möglichkeit gefunden!
Dasselbe mit dem Laden, weil bis jetzt hatte ich das so gemacht das er durch die aktuelle Schleifenposition (i-Schleifeniteration) erkennt welches Bild er darüberzeichnen soll. Bin auf keine bessere Lösung gekommen.

Im Prinzip soll das ganze Programm aufgrund der Übereinstimmung der Schaltartikel mit den Fahrwegen bestimmte Bilder anzeigen.

Das mit dem Initialisieren und den Indizes werd ich mir mal anschauen!

EDIT:
Zum automatischen indizieren, damit meinst du wahrscheinlich die 2 Schleifen am Anfang wo ich die Werte in das Array schreibe, wenn ich dort allerdings automatisch indiziere hatte das zuerst so, überspringt er die For-Schleife einfach, oder vertausche ich da jetzt was?

Lg
Erstmal sorry für den Doppelpost.

Ich hab jetzt zumindest Teilweise eine Lösung gefunden!

In meinem 1. Versuch habe ich die PNG datei jedes mal neu gezeichnet auch wenn gar keine neue png datei hinzugekommen ist (zum überschreiben).

Ich habe die Laufzeit jetzt so reduziert das ich nur zeichne wenn es auch umbedingt notwendig ist! Ist zwar nicht perfekt aber Ok für mich!

vorher 40 mal zeichnen
jetzt abhängig aber zwischen 0-10 mal

vorher 1200 ms
jetzt 50-200 ms

Hänge das neue *.vi an, vielleicht hilft es ja jemanden!


Eine Frage noch an unicorn, was genau meinst du mit
Zitat:Einsatz von logischen Operatoren statt Case-Anweisung

Versteh ich nicht ganz, bitte um Erklärung

Lg Manuel
Hallo Manuel,

zu deiner Lösung: da ist doch einiges an RubeGoldberg drin...

Siehe Anhang!

- Im ersten Frame: "konstante Operationen" außerhalb von Schleifen durchführen, Autoindizierung bei FOR-Loops nutzen, effiziente Funktionen zum Cluster-Bauen nutzen
- dritter Frame: Autoindizierung in der FOR-Loop nutzen! Wozu überhaupt eine FOR-Loop mit 60 Iterationen, wenn eines der beteiligten Arrays mit nur einem einzigen Element initialisiert wird? Wozu die FOR-Loop um den Pfad-Vergleich?

FOR-Loops unterstützen Autoindizierung - welche fast immer zu effizienteren Programmen (und leichter lesbaren) führt!!!
(06.12.2011 08:29 )kirmac09 schrieb: [ -> ]Zum automatischen indizieren, damit meinst du wahrscheinlich die 2 Schleifen am Anfang wo ich die Werte in das Array schreibe, wenn ich dort allerdings automatisch indiziere hatte das zuerst so, überspringt er die For-Schleife einfach, oder vertausche ich da jetzt was?

Lg

Mit der äußeren Schleife sollte das automatische Indizieren gehen. In der inneren Schleife geht es nicht, da Du jedes zweite Element nutzen willst (2*i).
(06.12.2011 11:14 )kirmac09 schrieb: [ -> ]..
Eine Frage noch an unicorn, was genau meinst du mit
Zitat:Einsatz von logischen Operatoren statt Case-Anweisung

Versteh ich nicht ganz, bitte um Erklärung
..

Dritter Frame: in der Schleife berechnest Du nur 'Not And' aus den beiden Boolean des Clusters. Das wäre der besagte logische Operator.

"Array"-Control und lokale Variable sind nicht nötig. Einfach einen Draht ziehen.

Bei Initialize Array nicht die Dimension, sondern die Anzahl der Elemente in der ersten Dimension angeben. Soll das Array zwei- oder mehrdimensional sein, muss das Initialize Array VI entsprechend größer ziehen.
Danke für die Hilfe, hat mir sehr viel weitergeholfen.

Hab das jetzt dementsprechend umgeändert.

Einzige Frage wenn ich mit einem 2D Array die Autoindizierung nutze, wird bei der ersten Schleife doch immer der Zeilenindex gewählt, was ist wenn ich den Spaltenindex zuerst will? Ist das möglich?

Lg
(06.12.2011 17:23 )kirmac09 schrieb: [ -> ]Einzige Frage wenn ich mit einem 2D Array die Autoindizierung nutze, wird bei der ersten Schleife doch immer der Zeilenindex gewählt, was ist wenn ich den Spaltenindex zuerst will? Ist das möglich?
Ein Transpose-2D-Array einfügen!

Gruß, Jens
Referenz-URLs