INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Alternativen zu globalen Variablen



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!

15.10.2007, 08:57
Beitrag #1

monoceros84 Offline
LVF-Stammgast
***


Beiträge: 445
Registriert seit: Oct 2006

2011
2006
EN


Deutschland
Alternativen zu globalen Variablen
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?

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.10.2007, 11:18 (Dieser Beitrag wurde zuletzt bearbeitet: 15.10.2007 11:42 von rolfk.)
Beitrag #2

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Alternativen zu globalen Variablen
' schrieb:[*]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.

Falsch. Die sind schon initialisiert beim Laden. LabVIEW intialisiert die nämlich garantiert auf den default Defaultwert für den Datentypen (also null für Zahlen, und leere Arrays und Strings). Dass das manchmal nicht ist was man gern möchte ist ein anderes Problem, aber definiert sind sie eben schon.

Zitat:[*]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?

Die Möglichkeit besteht auch nicht. Solange das SubVI nicht reentrant ist kann es nur gleichzeitig von einem anderen VI aufgerufen werden. LabVIEW rescheduled (oder wenn diese anderen Aufrufer nichts anderes mehr zu tun haben, blockiert) andere Aufrufer automatisch solange ein non-reentrant SubVI schon von jemandem ausgeführt wird.

Hier ist aber auch gleichzeitig ein möglicher Nachteil. Wenn dieses SubVI nämlich langdauernde Operationen macht (komplexe Berechnungen oder dergleichen) dann werden eben andere Teile des Programms auch aufgehalten.

Zitat:[*]Referenzen (schwierig bei Kommunikation über mehrere Programmmodule hinweg und zwischen völlig unterschiedlichen Sub-VIs)

Referenzen sind in dieser Hinsicht eine katastrophale Verschlimmbesserung. Diese werden immer im UI Thread ausgeführt, können das Programm also extreeeeem verlangsamen und gar blockieren wenn Du irgendwo in Deinem Programm beispielsweise einen Dialog (File Selection oder ein simpler 1 Button Dialog) anzeigen lässt. Die Datenkopie vom Kontrol wird hier ebenso getan als bei einer Globalen, also im Vergleich zur globalen Variable nur Nachteile.

Zitat:[*]FIFOs (funktioniert super, allerdings wird nicht der letzte Wert, sondern der nächste in der Liste abgefragt, was nicht immer zweckmäßig ist)

FIFOs können gut sein. Aber wenn Du es genau wie eine Globale verwendest ist es eigentlich auch nicht unbedingt viel besser, obwohl in LabVIEW 8 sind FIFO so obtimalisiert, dass der Datenbereich der beim Hineineschreiben in die FIFO queue kopiert wurde, automatisch wiederverwendet wird beim Auslesen also eine Kopie weniger ist da schon und wenn Du Daten nicht noch irgendwie anders verwendest (also ohne Verzweigung beim Write FIFO VI) dann wird gar keine Kopie getan. Aber das ist LabVIEW 8.x Funktionalität. In früheren Versionen waren die FIFOs und andere vergleichbare VIs (Notifier) nicht so smart.

Und wenn Dich nur der letzte Wert interessiert ist ein Notifier eigentlich besser. Auch hat das FIFO den Nachteil dass Du einen einmal gelesenen Wert nicht einfach noch mal lesen kannst (oder Du machst einen Peek aber dann muss das FIFO VI genauso eine Kopie machen wie beim Lesen des Notifiers).

Der Vorteil von intelligenten LV2 Style Globalen, wie ich die uninitialisierten Shiftregister VIs nenne, liegt vor allem darin, dass man in diese VIs Intelligenz stecken kann, so dass man wenn man in einem Array nur ein Element überschreiben will dies in diesem VI auch so programmiert und damit jede Kopie von Speicher vermeidet. Wenn Du eine LV2 Style Global genau so verwendest wie eine normale Global, also irgendwo Daten rein und irgendwo anders alle Daten wieder raus, dann sparst Du zwar im Vergleich zu Globalen immer noch eine Datenkopie, ähnlich wie bei Queues, aber optimal ist noch lange anders.

Um bei obigem Beispiel zu bleiben, nehme mal an dass Du ein 10 Millionen Elemente Array in so eine Globale steckst und da gerne ein Element an einem bestimmten Index ersetzen möchtest.

Wenn wir das mit globalen Variablen machen hast Du erstens eine mögliche Race-Condition, (zwischen dem Lesen der Variablen, Verändern und zurückschreiben kann jemand anders ebenfalls diese Variable verändern) und minimal 3 mal soviel Speicher (globale Variable selber, Lesekopie, Schreibkopie).

Bei Verwendung von trivialen LV2 Style Gobals hast Du noch immer die mögliche Race-Condition und doppelter Speicherverbrauch (Variable im Schieberegister, und Lesekopie) vorausgesetzt Du verzweigst den Draht nicht noch vor dem zurückschreiben in die LV2 Style Globale.

Wenn wir aber jetzt eine intelligente LV2 Style Global machen, die ausser den zwei Methoden "Read" und "Write" auch noch eine "Replace Element" Methode hat dann haben wir nicht nur keine Race-Condition mehr, sondern auch keinen extra Speicherbedarf da die Replace Array Funktion innerhalb dieses LV2 Style Global-VIs von LabVIEW automatisch so optimalisiert wird, dass der Buffer aus dem Schieberegister wiederverwendet wird.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.10.2007, 12:02
Beitrag #3

monoceros84 Offline
LVF-Stammgast
***


Beiträge: 445
Registriert seit: Oct 2006

2011
2006
EN


Deutschland
Alternativen zu globalen Variablen
Wahnsinn, danke für die vielen vielen Hinweise...! Jetzt bin ich um einiges schlauer!

Auch die Funktion, den Array-Eintrags direkt im Shiftregister zu ersetzen ist genial. Aber irgendwie hätte man da auch selbst drauf kommen können;)Ich fand' es schon immer ziemlich umständlich, erst das komplette Array zu lesen, dann einen Wert zu ersetzen und anschließend das ganze wieder zu schreiben. Anweisungen in textbasierten Sprachen wirken da simpler, obwohl man natürlich auch nicht weiß, was da im Hintergrund abläuft...

Also nochmal: Danke!

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.10.2007, 19:19 (Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2007 19:24 von Lucki.)
Beitrag #4

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Alternativen zu globalen Variablen
' schrieb:Kennt ihr weitere Möglichkeiten?
Ja: Umgebunsvariablen = Weiterentwicklung der globalen Variablen seit V8
Mit Zeitstempel und wirklich Global im Sinne von gültig im Gesamten Netz oder Internet.
Habe leider keine Erfahrungen damit.

Deine Methode mit nicht initialisiertem Schieberegister ist bekannt unter dem Begriff "Funktionale Globale Variable" und wurde hier schon diskutiert.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
18.10.2007, 15:49 (Dieser Beitrag wurde zuletzt bearbeitet: 18.10.2007 15:52 von rolfk.)
Beitrag #5

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Alternativen zu globalen Variablen
' schrieb:Ja: Umgebunsvariablen = Weiterentwicklung der globalen Variablen seit V8
Mit Zeitstempel und wirklich Global im Sinne von gültig im Gesamten Netz oder Internet.
Habe leider keine Erfahrungen damit.

Deine Methode mit nicht initialisiertem Schieberegister ist bekannt unter dem Begriff "Funktionale Globale Variable" und wurde hier schon diskutiert.

Umgebungsvariablen scheint mir eine schlechte Übersetzung der Shared Variablen, was Du scheinbar ansprichst. Umgebungsvariablen sind in meiner Erlebniswelt eher so die Dinge die man beispielsweise in einem LabVIEW 8.x Projekt setzen kann. Innerhalb des Projektes werden diese dann benützt um mit der Conditional Compile Struktur je nach dem Code auszuschliessen oder einzubinden. Auf etwas globalerem Niveau sind Umgebungsvariablen zum Beispiel die PATH Variable unter Windows, die von allen Applikationen gelesen werden kann.

Ich weiss zwar nicht ob Umgebungsvariable hier ein offizieller Name ist oder ob der von Dir kommt, aber Netzwerkvariable scheint mir den Sinn der Sache zumindest etwas besser zu beschreiben, auch wenn es natürlich so ist dass die auch lokal zugänglich ist. Aber der Zugrif darauf geschieht in jedem Fall über den Netzwerklayer.

Und was die Performance betrifft treffen alle Nachteile der globalen Variable auch darauf zu, nur wirds noch etwas langsamer, da nun der Zugriff durch die Netzwerklayer gehen muss statt nur innerhalb des LabVIEW Prozessspeichers.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
18.10.2007, 16:11
Beitrag #6

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Alternativen zu globalen Variablen
' schrieb:Umgebungsvariablen scheint mir eine schlechte Übersetzung der Shared Variablen, was Du scheinbar ansprichst.
Ich teile Deine Abneigung gegen diese Bezeichnung, da anderweitig bereits reserviert, aber es handelt sich hier wirklich um ein schlechte Übersetzung.
(Erstellen mit "Strukturen")
Die Gültigkeit im Netz ist natürlich nur bei entsprechender Konfiguration gegeben.
Wenn sie lokal verwendet werden, dann sind sie lediglich dadurch geringfügig langsamer als globale V., weil außer der Variablen noch der Zeitstempel herumtransportiert wird - so die Information auf einer Veranstaltung von NI.
Aber ich habe sie selbst noch nicht verwendet.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
18.10.2007, 16:17
Beitrag #7

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
Alternativen zu globalen Variablen
Ich verwende in meinem aktuellen Projekt einige Shared-Variables und habe bis jetzt keine Probleme damit.
Ich habe einen Bedienrechner und einen Auswerterechner, über die einige Daten ausgetauscht werden. Dies geht am praktischsten mit den Shared-Variables.
Auf dem einen Rechner schreibe ich die Daten rein und auf dem anderen hole ich sie raus.
Das ganze über TCP/IP-Elemente zu programieren wäre etwas schwierig und umfangreich.

Gruß Markus

' schrieb:Ja: Umgebunsvariablen = Weiterentwicklung der globalen Variablen seit V8
Mit Zeitstempel und wirklich Global im Sinne von gültig im Gesamten Netz oder Internet.
Habe leider keine Erfahrungen damit.

Deine Methode mit nicht initialisiertem Schieberegister ist bekannt unter dem Begriff "Funktionale Globale Variable" und wurde hier schon diskutiert.

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Problem mit den globalen Variablen Lessy2205 7 5.458 30.01.2013 16:40
Letzter Beitrag: GerdW
  Eingefrorene Werte in globalen Variablen frehdie 7 5.421 21.05.2012 10:31
Letzter Beitrag: frehdie
  Alternativen von Bedienelement auf Cases übertragen R2wo 2 5.186 20.12.2011 13:16
Letzter Beitrag: R2wo
  default value in globalen Variablen achim @ FZK 4 5.120 03.04.2009 14:21
Letzter Beitrag: franzl
  Mehrere Instanzen einer funktionalen globalen Variablen? joe79 6 6.656 26.01.2009 19:18
Letzter Beitrag: Y-P
  Ereignis auslösen mit einer globalen Variable? ed123 1 3.816 26.05.2008 19:39
Letzter Beitrag: eg

Gehe zu: