LabVIEWForum.de
Wie auf eine Instanz aus parallelen Prozessen zugreifen? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: LVOOP (/Forum-LVOOP)
+---- Thema: Wie auf eine Instanz aus parallelen Prozessen zugreifen? (/Thread-Wie-auf-eine-Instanz-aus-parallelen-Prozessen-zugreifen)

Seiten: 1 2 3


Wie auf eine Instanz aus parallelen Prozessen zugreifen? - Matze - 03.12.2010 10:53

Hallo,

ich habe auch eine Frage dazu, bin mir aber nicht klar, wie ich das umsetze:

Ich habe in den Private-Daten z.B. einen boolschen Wert. Einmalig weise ich dem nun etwas zu.
Anschließend möchte ich parallel auf diesen Wert zugreifen können (vorwiegend lesend, aber z.T. auch schreibend).

D.h. ich muss die Klassen-Instanz verzweigen, habe dann aber jeweils pro Verzweigung eigene Private-Daten und nicht mehr die selben. Ich möchte jedoch überall die selben haben.

Das ist vermutlich das, was IchSelbst auch möchte, aber ich verstehe überhaupt nicht, was ich da nun machen muss. Das Ganze irgendwie global über FGVs? Das kann's ja nicht sein ...Unsure
Oder wie in einem der Beispiele die Klassenreferenz verwenden?
Das ist total unübersichtlich, da dann die Farben der Drähte alle gleich sind und auf den ersten Blick nicht mehr unterschieden werden kann, was wohin gehört.


Wie auf eine Instanz aus parallelen Prozessen zugreifen? - abrissbirne - 03.12.2010 13:07

Wie wäre es denn mit dem Reference Pattern?
Prinzip: Was ist in LabVIEW referenzierbar? --> Eine Queue.
Schiebe dein Objekt nach der Erzeugung einfach in eine Single Element Queue. Schreibe dir ein Checkin und ein Checkout VI, welches das Objekt aus der Queue herausholt und wieder hineinschiebt. Solange das Objekt ausgecheckt ist kann der zweite Thread nicht darauf zugreifen. Vorteil: Du hast einen gegenseitigen Auschluss und Raceconditions vermieden.Big Grin


Wie auf eine Instanz aus parallelen Prozessen zugreifen? - macmarvin - 03.12.2010 13:28

Per DVR auf die Klasseninstanz bekommst du den Bonus, das dyn. Dispatch transparent funktioniert.
Wobei ich üblicherweise auch eher die alt-hergebrachte (NB-)SEQ benutze.


Wie auf eine Instanz aus parallelen Prozessen zugreifen? - IchSelbst - 03.12.2010 15:05

' schrieb:Schiebe dein Objekt nach der Erzeugung einfach in eine Single Element Queue. Schreibe dir ein Checkin und ein Checkout VI, welches das Objekt aus der Queue herausholt und wieder hineinschiebt. Solange das Objekt ausgecheckt ist kann der zweite Thread nicht darauf zugreifen. Vorteil: Du hast einen gegenseitigen Auschluss und Raceconditions vermieden.
Naja, das ist aber auch nur das eine von zwei Übeln (Das andere Übel sind die FGVs).

Der Vorteil von LV gereicht hier zum Nachteil: Wenn ein Datensatz, ob abgelegt in FGV, Queue oder Klasse, sich wegen Bearbeitung gerade in einem Datenfluss befindet, so darf der Datenfluss solange nicht gestört werden, bis der Datensatz wieder abgelegt ist (in FGV, Queue oder Klasse). Dumm nur, dass LV per se ein Multitasking-System ist (jede While-Schleife eine Task), das es dem Anwender leicht macht (bis hin zu: er merkt es gar nicht), die Datenflüsse in anderen Tasks zu stören (fatale Folge wäre RaceCondition).

Die Queue-Methode ist einfach zu durchschauen: befinden sich die Daten der Queue zwecks Bearbeitung in einem Datenfluss - sind sie nicht mehr in der Queue und somit für jeden anderen nicht "störbar". FGVs sind eine Stufe komplizierter: Die Bearbeitung findet innerhalb des FGVs-SubVis statt. Da während der Bearbeitung das SubVI nicht noch ein zweites Mal ausgeführt werden kann, stellt auch das eine sichere Methode dar. Man darf natürlich nicht die zu bearbeitenden Daten aus dem SubVI herausgeben, bearbeiten und wieder hineingeben. Dann ist ein Datenfluss vorhanden, der von extern störbar ist (= RaceCondition).

Am liebsten hätte man natürlich eine Klassen-Instanz, die prinzipiell funktioniert wie eine FGV: Solange eine Instanz arbeitet, kann sie von niemand anderem Arbeit entgegennehmen.

Ich bleibe vorerst bei meinen FGVs. Die reichen für meine Belange bisher vollkommen aus.


Wie auf eine Instanz aus parallelen Prozessen zugreifen? - abrissbirne - 03.12.2010 15:49

' schrieb:Ich bleibe vorerst bei meinen FGVs. Die reichen für meine Belange bisher vollkommen aus.
Dafür musst du für jede Aufgabe eine FGV "schreiben" bzw. ein VIT öffnen und anpassen. Mit LVOOP machst du das einmal und ann nie wiederTongue


Wie auf eine Instanz aus parallelen Prozessen zugreifen? - macmarvin - 03.12.2010 15:53

Jepp, von der Skalierbarkeit her, sind FGVs einfach nicht wirklich gut, schon gar nicht, wenn dynamische Instanzierungen benötigt werden.


Wie auf eine Instanz aus parallelen Prozessen zugreifen? - IchSelbst - 03.12.2010 23:16

' schrieb:Mit LVOOP machst du das einmal und ann nie wiederTongue
Eine "Bitte Warten"-Instanz mit AutoCountDown und ein Ein-Button-Quittierungs-Dialog von einem Klassentyp ableiten?


Wie auf eine Instanz aus parallelen Prozessen zugreifen? - Matze - 04.12.2010 00:03

' schrieb:Wie wäre es denn mit dem Reference Pattern?
Prinzip: Was ist in LabVIEW referenzierbar? --> Eine Queue.
Wie meinst du das genau?
Wenn ich mit dem Objekt etwas machen möchte, schreibe ich eine Referenz in eine Queue, damit parallele Zugriffe verhindert werden?

Wenn man es über Referenzen löst, macht man das dann über einen "Dummy-Ausgang" oder geht das eleganter?
Beispiel:

[attachment=31038]


Wie auf eine Instanz aus parallelen Prozessen zugreifen? - macmarvin - 04.12.2010 07:44

"Reference Pattern" oder auch by-ref Klassen sind als Example enthalten.
Prinzipiell ist's eine SEQ mit by-val Object als Inhalt.

LV2010 Example Finder:
"ReferenceObject.lvproj
Description:
This example demonstrates by-reference objects using LabVIEW classes."


Wie auf eine Instanz aus parallelen Prozessen zugreifen? - Matze - 04.12.2010 08:48

Danke. Wenn man weiß, wonach man suchen muss, ist manches einfacher.Wink

Sieht kompliziert aus, aber ich versuche es mal.