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 

Dieses Thema hat akzeptierte Lösungen:

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.)
Beitrag #1

buechling Offline
LVF-Grünschnabel
*


Beiträge: 11
Registriert seit: Jan 2015

2013
2010
DE



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..

Zitat: .NET (Referenz)
ActiveX (Referenz)
Bluetooth-Netzwerkverbindung (Referenz)
Bytestream-Datei (Referenz)
Elementreferenz
Datenprotokolldatei (Referenz)
DataSocket-Referenz
IrDA-Netzwerkverbindung (Referenz)
Occurrence (Referenz)
TCP-Netzwerkverbindung (Referenz)
UDP-Netzwerkverbindung (Referenz)
VI-Referenz

Das ganze widerspricht natürlich dem Datenflussprinzip von LabView.. Aber hat die Objektorientierung nicht noch irgendwas zu bieten?

Edit jg: Externe Bildlinks gelöscht
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
16.01.2015, 07:21
Beitrag #2

macmarvin Offline
CLA
***


Beiträge: 445
Registriert seit: Sep 2006

2014
2004
EN

81373
Deutschland
RE: Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?

Akzeptierte Lösung

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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.01.2015, 08:20 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2015 09:09 von GerdW.)
Beitrag #3

GerdW Offline
______________
LVF-Team

Beiträge: 17.410
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
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…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.01.2015, 09:06
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Datenstrukturen mit Nebeneffekt - Referenzen - wie geht es?
Offtopic2
@macmarvin: Externe Bildlinks gelöscht, Bilder hier hochgeladen.

@buchling: Bitte in Zukunft LVF-Regeln beachten und Anhänge hier im Forum hochladen.

Danke, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.01.2015, 09:34 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2015 09:41 von buechling.)
Beitrag #5

buechling Offline
LVF-Grünschnabel
*


Beiträge: 11
Registriert seit: Jan 2015

2013
2010
DE



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 )
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.01.2015, 09:40
Beitrag #6

GerdW Offline
______________
LVF-Team

Beiträge: 17.410
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
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… Big Grin

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…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
16.01.2015, 09:54
Beitrag #7

buechling Offline
LVF-Grünschnabel
*


Beiträge: 11
Registriert seit: Jan 2015

2013
2010
DE



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 Smile 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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.01.2015, 09:58 (Dieser Beitrag wurde zuletzt bearbeitet: 16.01.2015 09:59 von GerdW.)
Beitrag #8

GerdW Offline
______________
LVF-Team

Beiträge: 17.410
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
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…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.01.2015, 10:16
Beitrag #9

buechling Offline
LVF-Grünschnabel
*


Beiträge: 11
Registriert seit: Jan 2015

2013
2010
DE



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..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
16.01.2015, 10:28
Beitrag #10

GerdW Offline
______________
LVF-Team

Beiträge: 17.410
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
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…

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Extrem langsamer Variablen Zugriff über Referenzen hajos118 12 3.326 01.08.2022 17:20
Letzter Beitrag: BNT
  Muss man Referenzen von controls überhaupt schließen? dimitri84 4 3.362 21.04.2022 11:57
Letzter Beitrag: dimitri84
  Referenzen in mehreren Bibliotheken aktualisieren seuk 3 3.360 12.09.2019 09:10
Letzter Beitrag: IchSelbst
  Cluster mit Referenzen auf FP-Elemente Oli_N 8 7.873 15.02.2017 11:19
Letzter Beitrag: Oli_N
  Frage zu Referenzen maxxillian 1 3.652 21.10.2016 08:04
Letzter Beitrag: GerdW
  Alternative zu Referenzen moTo 2 3.687 26.04.2016 18:16
Letzter Beitrag: moTo

Gehe zu: