15.10.2007, 08:57
Hi,
da globale Variablen langsam und speicherintensiv sind, habe ich bisher die Variante über ein nicht-initialisiertes Schieberegister in einem SubVI benutzt. Siehe dazu meinen Anhang aus einem früheren Post:
http://www.LabVIEWforum.de/index.php?act=A...st&id=36008
Nun habe ich mich aber gefragt, wieso NI diese Methode nicht auch intern für die globalen Variablen verwendet, wenn sie nur Vorteile hat. Daraus schließe ich, dass ich mit der Geschwindigkeit auch Nachteile erkaufe, über die ich mir aber bisher etwas unklar bin. Folgende zwei kommen mir in den Sinn:[list=1]
[*]Kein Initialisieren. Beim Erstellen der Variable wird diese nicht mit einem Standardwert belegt. Wenn man also ein READ vor einem ersten WRITE ausführen sollte, bekommt man einen undefinierten Zustand.<>
[*]Möglichkeit auf fehlerhafte Race-Conditions bei gleichzeitigem Schreib-Zugriff auf die Variable. Dies wird mit globalen Variablen über das Anlegen einer Speicherkopie vermieden, habe ich das richtig verstanden? Wie entscheidet diese dann, welcher Wert übernommen werden soll, wenn zwei Werte gleichzeitig geschrieben werden?<>
[st]Liege ich mit meinen Vermutungen richtig und gbt es eventuell noch weiter Nachteile?
Weiter Alternativen dazu sind meiner Meinung nach:[list]
[*]Referenzen (schwierig bei Kommunikation über mehrere Programmmodule hinweg und zwischen völlig unterschiedlichen Sub-VIs)<>
[*]FIFOs (funktioniert super, allerdings wird nicht der letzte Wert, sondern der nächste in der Liste abgefragt, was nicht immer zweckmäßig ist)<>
[st]Kennt ihr weitere Möglichkeiten?
da globale Variablen langsam und speicherintensiv sind, habe ich bisher die Variante über ein nicht-initialisiertes Schieberegister in einem SubVI benutzt. Siehe dazu meinen Anhang aus einem früheren Post:
http://www.LabVIEWforum.de/index.php?act=A...st&id=36008
Nun habe ich mich aber gefragt, wieso NI diese Methode nicht auch intern für die globalen Variablen verwendet, wenn sie nur Vorteile hat. Daraus schließe ich, dass ich mit der Geschwindigkeit auch Nachteile erkaufe, über die ich mir aber bisher etwas unklar bin. Folgende zwei kommen mir in den Sinn:[list=1]
[*]Kein Initialisieren. Beim Erstellen der Variable wird diese nicht mit einem Standardwert belegt. Wenn man also ein READ vor einem ersten WRITE ausführen sollte, bekommt man einen undefinierten Zustand.<>
[*]Möglichkeit auf fehlerhafte Race-Conditions bei gleichzeitigem Schreib-Zugriff auf die Variable. Dies wird mit globalen Variablen über das Anlegen einer Speicherkopie vermieden, habe ich das richtig verstanden? Wie entscheidet diese dann, welcher Wert übernommen werden soll, wenn zwei Werte gleichzeitig geschrieben werden?<>
[st]Liege ich mit meinen Vermutungen richtig und gbt es eventuell noch weiter Nachteile?
Weiter Alternativen dazu sind meiner Meinung nach:[list]
[*]Referenzen (schwierig bei Kommunikation über mehrere Programmmodule hinweg und zwischen völlig unterschiedlichen Sub-VIs)<>
[*]FIFOs (funktioniert super, allerdings wird nicht der letzte Wert, sondern der nächste in der Liste abgefragt, was nicht immer zweckmäßig ist)<>
[st]Kennt ihr weitere Möglichkeiten?