Wie auf eine Instanz aus parallelen Prozessen zugreifen?
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!
10.04.2010, 10:03 (Dieser Beitrag wurde zuletzt bearbeitet: 10.04.2010 12:00 von IchSelbst.)
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
Abrissbirne hat hier eine spezifische Frage zum Vorgehen bei Erstellen einer Klasse gestellt. eg hat ein Posting gemacht, auf das ich mit einem neuen Thema antworten will - weil ich eine Frage aufwerfen möchte, die nichts mit der von abrissbirne zu tun hat:
' schrieb:Man handelt mit OOP-Objekten im Programm genauso wie mit realen Objekten im Leben.
Diese Aussage ist allgemein betrachtet natürlich richtig.
Eine LabVIEW-spezifische Eigenschaft jedoch behindert die "lebensnahe Umsetzung der Beziehungen" zwischen unterscheidlichen Instanzen erheblich: der Datenfluß.
In Realität sind Instanzen nicht sequenziert (naja, vielleicht manche). In LV soll die Instanz-Variable als Datenfluß geführt werden. Das führt aber ganz schnell zu großen Problemen bei der Verwendung von Instanzen. z.B. dann, wenn ich in parallel laufenden Prozessen auf diese eine Instanz zugreifen will. Man kann diese Probleme natürlich mit Tricks umgehen (z.B. FGVs) - was dann aber die Übersichtlichkeit und das Debuggen erschwert.
In einer textorientierten Sprache kann die Instanz-Variable global vorliegen. Jeder(, der die Erlaubnis bekommen hat) hat Zugriff auf die Instanz und kennt deren Typ (verwendbar sind natürlich nur die öffentlichen bzw. veröffentlichten Elemente). Das entspricht in LV also einer "Globalen Variablen" (in LV nicht zu verwenden), der Zugriff gilt als "by reference".
Hier die Vorgeschichte zu meiner Frage:
Ich will auch mal eine Klasse machen und zwar von einem Modul, was bereits existiert und hervorragend funktioniert. Es handelt sich um das Modul "Bitte Warten", von dem ich die verschiedenen LV-Versionen mal als ZIP-Files angehängt habe. Eine (1) Klasseninstanz soll in beliebigen parallelen Prozessen aufrufbar sein. Später soll es möglich sein, mehrere dieser Instanzen parallel und aus parellelen Prozessen heraus aufzurufen.
Jetzt die Frage:
Wie mach ich das mit LVOOP, eine einzige Klassen-Variable ohne deren Datenfluß zu verwenden? Und ohne sie als global zu definieren.
Hinweis zur den Lizenzbedingungen für "BitteWarten":
Einzige Bedingung: Sollten die LV-Tassen wider Erwarten doch nicht ankommen, bitte dem Admin auf die Füße treten!
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
' schrieb:Jetzt die Frage:
Wie mach ich das mit LVOOP, eine einzige Klassen-Variable ohne deren Datenfluß zu verwenden? Und ohne sie als global zu definieren.
Ich würde sagen gar nicht. Wenn dir der "Trick" (ich finde es ist kein Trick) mit der FGV um das Klasseelement abzulegen nicht gefällt solltest du vermutlich GOOP verwenden.
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
Ehrlich gesagt habe ich das Problem nicht verstanden
Du willst aus deinem BitteWarten eine Klasse machen und diese von mehreren parallelen Tasks aufrufen können. Soll die FGV global fürs ganze Programm laufen oder soll die Funktion der FGV überall verfügbar sein, aber pro Aufruf eine eigene Instanz benutzt werden? Mit dem 1 ist ja kein Problem, das 2 kann man (wenn ich mich nicht irre) mit Reentrance lösen.
Oder ich habe etwas falsch verstanden. Übrigens verwende ich keine FGV, vielleicht verstehe ich deshalb nicht das Problem.
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
' schrieb:Du willst aus deinem BitteWarten eine Klasse machen und diese von mehreren parallelen Tasks aufrufen können.
Genau, das will ich.
Zitat:Soll die FGV global fürs ganze Programm laufen oder soll die Funktion der FGV überall verfügbar sein, aber pro Aufruf eine eigene Instanz benutzt werden?
Ersteres.
Ersteres bedeutet, eine Wanduhr zu haben in allen Prozessen. Weiterhin soll die Möglichkeit bestehen, mehrere Wanduhren in allen Prozessen zu haben.
Zitat:Mit dem 1 ist ja kein Problem
FGV hat einen Nachteil: Um eine Methode der Klasse auszuführen, braucht man immer drei SubVIs: FGV lesen, Methode ausführen, FGV schreiben. Problem: da ist ein Stück Datenfluß zwischen FGV lesen und schreiben, was zu RaceConditions führen kann. => Während diese drei SubVIs ausgeführt werden, muss der Zugriff auf die Klassenvariable blockiert werden => Wieder zwei Teile mehr am BD.
[*nachdenk*]
Eigentlich soll eine FGV ja lediglich Daten (Schieberegister auf While-Schleife) speichern. Das FGV so aufzubohren, dass auch Methoden möglich sind (Case-Struktur mit Enumeratoreingang), macht aus einer FGV ja schon eine Klasse.
Soll ich jetzt also das bestehende BitteWarten-Main hernehmen, einen Klassencluster reinsetzen, alle Schieberegister-Variablen in den Cluster - und fertig? - Nach außen hin wäre das dann identisch mit dem bisherigen.
Jetzt muss ich nur noch überlegen, ob dieses dann prinzipiell meinen Vorstellungen entspricht.
[/*nachdenk*]
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
' schrieb:So, jetzt hab ich das Teil in LVOOP - und wo hab ich jetzt einen Vorteil?
Verstehe deine Frage jetzt wirklich nicht, da du die Vorteile von OOP ja scjon selbst aufgeführt hast. Du findest es halt unnötig und das ist dein gutes Recht. OOP ist eben ein Programmierkonzept, nicht mehr und nicht weniger. Du musst es ja nicht verweden.
' schrieb:Jetzt die Frage:
Wie mach ich das mit LVOOP, eine einzige Klassen-Variable ohne deren Datenfluß zu verwenden? Und ohne sie als global zu definieren.
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
' schrieb:Ich habe da mal was gebastelt.
Wenn schon mit Referenzen, dann alles andere weglassen. Ich lass mir das mit den Referenzen nochmals durch den Kopf gehen.
Derweil kann ja mal einer abrissbirnes Muster unter LV-2009 mit Sonde an der markierten Stelle laufen lassen. Läuft da auch der Speicher mit ca. 10MB pro Sekunde voll. Mit 85 geht alles richtig.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
' schrieb:Wenn schon mit Referenzen, dann alles andere weglassen. Ich lass mir das mit den Referenzen nochmals durch den Kopf gehen.
Das kannst du knicken. Wenn du die Referenz anstatt des Klasseneingangs nimmst, kannst du keine Dynamic Dispatch VIs bauen. Du kannst die Referen auch nachträglich nicht als Dynamic Dispatch deklarieren. Auf die schnelle konnte ich mir eben nur so helfen.
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
' schrieb:Wenn du die Referenz anstatt des Klasseneingangs nimmst, kannst du keine Dynamic Dispatch VIs bauen.
Bei derartigen VIs soll mir das Recht sein, das mit dem KlassenCluster-Eingang.
Bei privaten Methoden, die eigentlich nur vorhanden sind, weil man halt gelegentlich was in SubVIs auslagern soll/will/muss, lasse ich den Klassencluster getrost weg. Guckst du mein Muster: privates SubVI ohne KlassenCluster.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
' schrieb:Bei derartigen VIs soll mir das Recht sein, das mit dem KlassenCluster-Eingang.
Bei privaten Methoden, die eigentlich nur vorhanden sind, weil man halt gelegentlich was in SubVIs auslagern soll/will/muss, lasse ich den Klassencluster getrost weg. Guckst du mein Muster: privates SubVI ohne KlassenCluster.
Hab geguckt:cool:Dann würde es natürlich für deine Anwendung reichen.
' schrieb:Wenn schon mit Referenzen, dann alles andere weglassen. Ich lass mir das mit den Referenzen nochmals durch den Kopf gehen.
Derweil kann ja mal einer abrissbirnes Muster unter LV-2009 mit Sonde an der markierten Stelle laufen lassen. Läuft da auch der Speicher mit ca. 10MB pro Sekunde voll. Mit 85 geht alles richtig.
Hat das schon jemand gemacht? Würd mich auch interessieren.