Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
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!
16.01.2015, 00:54 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2015 09:04 von jg.)
Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
Hallo zusammen,
mich beschäftigt seit lägerem ein Problem mit meiner Datenstruktur.. Habe so ziemlich die ganze Doku gelesen aber sehe keine Lösung. Ich möchte es mit folgendem Bild zusamen fassen:
gibt es einen Weg, dass das Anzeigeelement "1234" anzeigt, obwohl keine Kopie der Daten durchgereicht wird? Ich suche also eine Art Zeiger auf eine Datenstruktur, damit verschiedene VIs scrheiben können und andere VIs lesen können, ohne dass sie direkt verbunden sind. Also ein Nebeneffekt des Schreib-VIs in das Lese-VI. Ich erhoffe mir dadurch Speicher zu sparen, wenn Daten nicht ständig umhergereicht werden müssen, sondern nur der Zeiger..
Im Gegensatz zu Queues oder Meldern sollen die Daten dauerhaft gespeichert bleiben. Im Gegensatz zu globalen Variablen will ich Race Conditions in der Struktur abfangen ( Arrays in globalen Variablen kommt nicht gut! ). Ich kann es nur schwer in einem unverbundenen Schieberegister speichern ( Struktur ändert sich / sehr viele Elemente / erneut Race Conditions ) . Mir ist das ganze nur mit Frontpanelelementen gelungen: Ich kann eine Refernez auf ein Frontpanelelement eines anderen VIs erstellen... das scheint mir aber ziemlich ineffektiv wenn für 30 Kopien 30 Fenster offen sein müssen! ( Fenster verstecken geht dann nicht ). So kommt "1234" bei "Daten" raus:
Gibt es dieses "Element festlegen" also auch irgendwie für Klassen?
LabView listet nur folgende "Typen von Referenzelementen" auf. Warum gibt es keine Referenz auf Cluster oder zb Strings? "Neeue Datenwertreferenz" scheint mir eine Einbahnstrasse zu sein..
RE: Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
Moin,
könntest Du die Bilder direkt hier hochladen bitte. Leider blockiert das Firmennetzwerk hier solche Uploadseiten.
Deshalb nur auf Basis des Textes...
Das klingt sehr danach, daß Datenwertreferenzen hier sehr gut passen würden. Was meinst Du mit Einbahnstraße? Im einfachsten Fall: Einmal Anlegen per Create, dann schön Threadsicher per Inplacestruktur darauf zugreifen (R/W) und am (Programm-) Ende wieder schließen. Wichtig: Innerhalb der Inplacestruktur die Datenverwaltung implentieren, sonst drohen wieder Raceconditions.
16.01.2015, 08:20 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2015 09:09 von GerdW.)
RE: Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
Hallo buechling,
Zitat:gibt es einen Weg, dass das Anzeigeelement "1234" anzeigt, obwohl keine Kopie der Daten durchgereicht wird?
Falsch. In deinem Bild mit der OOP-Implementierung wird eine Kopie der Daten durchgereicht. Dummerweise eine Kopie von dem Zeitpunkt, bevor du den Wert 1234 setzt!
Wenn du einen Draht verzweigst, erstellt LabVIEW eine Daten-Kopie. Für OOP heißt das: es wird ein neues Objekt erstellt!
Zitat:Ich suche also eine Art Zeiger auf eine Datenstruktur, damit verschiedene VIs scrheiben können und andere VIs lesen können, ohne dass sie direkt verbunden sind. Also ein Nebeneffekt des Schreib-VIs in das Lese-VI. Ich erhoffe mir dadurch Speicher zu sparen, wenn Daten nicht ständig umhergereicht werden müssen, sondern nur der Zeiger..
- Es gibt fertige Beispiele (such mal auf NI.com), die den Umgang mit DataValueReferences (DVR) zeigen!
- Dein simples Beispiel ließe sich mit einer FGV leicht realisieren…
Zitat:Gibt es dieses "Element festlegen" also auch irgendwie für Klassen?
Nein. Das Grundkonzept von OOP ist die Datenkapselung und der exklusive Datenzugriff über Methoden der Klasse!
Zitat:LabView listet nur folgende "Typen von Referenzelementen" auf. Warum gibt es keine Referenz auf Cluster oder zb Strings?
Es gibt Referenzen auf Cluster. Und auch welche auf Strings. Und auf alle anderen FP-Elemente…
RE: Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
Danke Jens fürs Bilder einfügen!
Danke macmarvin, das ist tatsächlich die Lösung. Ich war irgendwie davon ausgegangen, dass folgendes Programm auch wieder auf zwei verschiedenen Datenbereichen arbeitet. Aber es kommt "String 2" heraus:
Danke GerdW, DataValueReferences ist tatsächlich das Stichwort was mir bisher gefehlt hat.. Hier steht sogar wie ich Referenzen auf Klassenobjekte hinbekomme und somit mein ursprüngliches Problem löse: http://www.ni.com/white-paper/9386/en/ . Refernezen auf Frontpanelelemente finde ich wie gesagt unfassbar unpraktisch.. Bei 1000 Datensätzen muss ich ( wenn ich die Nachteile von Arrays vermeiden will ) ein Frontpanel mit 1000 Elementen zusammenklicken ( geht nur per Hand!? ) oder ein ablaufinvariantes VI 1000 mal aufrufen - aber dann habe ich 1000 Fenster offen!
Meine Lösung nun: Ich entferne den unteren Haken "Refernezen beschränken"
Dann geht folgendes, die Ausgabe ist "1234"
Dazu nur noch eine Frage: LabView sperrt den Speicher nun automatisch, wenn eine Inplacestruktur mit lesen anfängt? Was ist wenn ich nun gleichzeitig in diesem Speicherbereich nur lesen will - kann ich dies dann trotzdem noch irgendwie machen oder muss ich warten bis der Schreibvorgang abgeschlossen ist ( eventuell dauert die Berechnung etwas länger und ich möchte einfach nur den alten Wert auslesen )
RE: Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
Hallo buechling,
Zitat:ein Frontpanel mit 1000 Elementen zusammenklicken ( geht nur per Hand!? )
Da sind nur 10 Schritte nötig: 1 FP-Element erzeugen, markieren, kopieren. Dann das Markieren&Kopieren 9mal wiederholen…
Im Ernst: Was soll ein FP mit 1000 Anzeigeelementen? Abgesehen vom Platzbedarf ist das doch komplett unübersichtlich! Kannst du den Anwendungsfall genauer beschreiben?
Zitat:wenn ich die Nachteile von Arrays vermeiden will
Welche wären das, wenn es um die Anzeige von 1000 Datensätzen geht?
Zitat:Refernezen auf Frontpanelelemente finde ich wie gesagt unfassbar unpraktisch.
Referenzen sind äußerst praktisch, wenn man Eigenschaften der Elemente ändern will/muss…
RE: Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
(16.01.2015 09:40 )GerdW schrieb: Im Ernst: Was soll ein FP mit 1000 Anzeigeelementen? Abgesehen vom Platzbedarf ist das doch komplett unübersichtlich! Kannst du den Anwendungsfall genauer beschreiben?
Jaa natürlich ist das quatsch Naja ich würde meine Daten mit einer Art Datenbank vergleichen: Ich habe einen Cluster mit 20 Elementen: Zahlen; Strings, Zeitstempel = Daten-Definition. Davon lade ich 50 verschiedene Kopien in den Speicher = Zeilen in einer Datenbank. Mein Programm soll nun etwas in Zeile 2 berechnen und braucht dafür Werte aus Zeile 4,8 und 43. Gleichzeitig berechnet ein anderer Thread etwas in Zeile 7 und braucht dafür Daten aus Zeile 4,9 und 41. Ein anderer Thread liest ständig Daten aus Dateien und schreibt sie nacheinadner in alle Zeilen. Ein anderer Thread liest periodisch alle Zeilen aus und schreibt sie in eine Datei. Dieses ganzen Ablauf ohne Referenzen zu machen, ist sehr schwierig. Da ich bisher keine anderen Referenzen kannte, hab ich es eben mit Frontpanelreferenzen gelöst. Ein Array mit 50 Elementen geht nicht, da ja ein Thread das ganze Array blockieren müsste ( komplettes Array lesen, Cluster verändern, komplettes Array schreiben, freigeben ) damit es keine Race Conditions gibt. Mit 50 einzelnen Elementen müssen zb nur 4 Elemente gesperrt werden wenn auf 4 Elemente zugegriffen wird.
Hätte ich jetzt nicht von diesen DVR erfahren, hätte ich das ganze übrigens tatsächlich mit einer simplen Datenbank wie "redis" gelöst - diese kennt nur Schlüssel-Werte-Datenstrukturen, ist aber sehr schnell.
16.01.2015, 09:58 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2015 09:59 von GerdW.)
RE: Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
Hallo buechling,
Zitat:Ein Array mit 50 Elementen geht nicht, da ja ein Thread das ganze Array blockieren müsste … damit es keine Race Conditions gibt.
Das ist ein typischer Anwendungsfall für eine FGV. Super einfach, sichere Datenkapselung, definierte Zugriffe. Quasi wie OOP mit einem einzelnen Objekt, aber ohne OOP-Overhead…
Deine FGV muss folgendes können:
- Array mit Clusterelementen anlegen (INIT)
- Arrayelement schreiben (Write)
- Arrayelement lesen (Read)
- mehrere Arrayelemente lesen (Read multiple)
- wenn gewünscht: komplettes Array lesen (Read All)
- wenn gewünscht: RMW-Operationen (Read-Modify-Write) als feste Operation hinterlegen
- weitere nach Wunsch…
RE: Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
Okay das klingt gut.. ich hatte bisher nur Angst dass dabei zu viel overhead entsteht.. Weil ich ja bei "Teil-Array ersetzen" das komplette alte Array reinstecke, dann noch den kompletten neuen Cluster.. rechts kommt ein neues Array heraus.. Ich will ja nicht dass jedes mal eine Kopie meines kompletten Arrays erstellt werden soll, sondern eben nur ein Element verändert..
RE: Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
Hallo buechling,
Zitat:Ich will ja nicht dass jedes mal eine Kopie meines kompletten Arrays erstellt werden soll, sondern eben nur ein Element verändert..
Die FGV speichert dein Array in einem Schieberegister. An nur einer Stelle und ohne weitere Kopie.
Zugriffe erfolgen nur über die FGV. Es entstehen nur Kopien, wenn du das komplette Array aus der FGV ausliest. Dies ist aber auch der Fall bei globalen Variablen oder OOP-Objekten…