03.12.2010, 10:53
(Dieser Beitrag wurde zuletzt bearbeitet: 03.12.2010 10:56 von Matze.)
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
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 ...
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.
|
|
|
03.12.2010, 13:07
|
abrissbirne
LVF-Stammgast
Beiträge: 480
Registriert seit: Aug 2007
LV2009, LV2010
2007
EN
66123
Deutschland
|
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
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.
|
|
|
03.12.2010, 15:05
|
IchSelbst
LVF-Guru
Beiträge: 3.700
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
' 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.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
03.12.2010, 15:49
(Dieser Beitrag wurde zuletzt bearbeitet: 03.12.2010 15:49 von abrissbirne.)
|
|
|
04.12.2010, 00:03
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
' 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:
|
|
|
04.12.2010, 08:48
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Wie auf eine Instanz aus parallelen Prozessen zugreifen?
Danke. Wenn man weiß, wonach man suchen muss, ist manches einfacher.
Sieht kompliziert aus, aber ich versuche es mal.
|
|
|
| |