21.10.2010, 08:53
Beitrag #1
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Erzeuger-Verbraucher-System beenden
Hallo,
wie beendet man denn die Schleifen beim Erzeuger-Verbraucher-System ordentlich?
NI fragt beim Auslesen den Fehler-Cluster ab und im Fehlerfall wird beendet. Das geht, aber das ist nicht sauber: Die Referenz wird zerstört und beim anschließenden Zugriff der Fehler ausgewertet.
Geht man normalerweise her und nutzt z.B. einen Melder, der signalisiert, dass nun das Programmende folgt und reagiert darauf oder evtl. mit Kommunikation über benutzerdefinierte Ereignisse?
Wie löst ihr das ordentlich?
Grüße
|
|
|
21.10.2010, 09:02
Beitrag #2
|
Morpheus
LVF-Gelegenheitsschreiber
Beiträge: 205
Registriert seit: Jul 2009
2019 SP1, 2020 SP1
2005
EN
8000
Schweiz
|
Erzeuger-Verbraucher-System beenden
Hallo Mecha.
Um dieses Problem zu lösen würde ich eine Meldung (per Queue) vom Erzeuger zum Verbraucher senden.
Das heisst konkret, der Erzeuger-Loop stopt wenn der Benutzer auf Stop drückt und wenn der Verbraucher den Stop-Befehl vom Erzeuger per Queue erhält, dann stopt auch dieser.
Gruss
Christ
|
|
|
21.10.2010, 09:03
Beitrag #3
|
IchSelbst
LVF-Guru
Beiträge: 3.689
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Erzeuger-Verbraucher-System beenden
' schrieb:NI fragt beim Auslesen den Fehler-Cluster ab und im Fehlerfall wird beendet. Das geht, aber das ist nicht sauber: Die Referenz wird zerstört und beim anschließenden Zugriff der Fehler ausgewertet.
Ich halte das nicht für ein unsauberes Verfahren. Ich würde nicht "zerstört" sagen, sondern "normal beendet". Auch in Normal-OOP würde man so was machen: "if not(assigned(referenz)) then ...".
Zitat:Geht man normalerweise her und nutzt z.B. einen Melder, der signalisiert, dass nun das Programmende folgt und reagiert darauf oder evtl. mit Kommunikation über benutzerdefinierte Ereignisse?
Nichtsdestoweniger verwende ich ein anderes Verfahren: Über die Steuer-Queue einen Befehl "ExitClass" hinschicken ...
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
21.10.2010, 13:58
(Dieser Beitrag wurde zuletzt bearbeitet: 21.10.2010 14:02 von Lucki.)
Beitrag #4
|
Lucki
Tech.Exp.2.Klasse
Beiträge: 7.699
Registriert seit: Mar 2006
LV 2016-18 prof.
1995
DE
01108
Deutschland
|
Erzeuger-Verbraucher-System beenden
' schrieb:NI fragt beim Auslesen den Fehler-Cluster ab und im Fehlerfall wird beendet. Das geht, aber das ist nicht sauber: Die Referenz wird zerstört und beim anschließenden Zugriff der Fehler ausgewertet.
Ich finde auch, man kann das an sich so machen. Das Unsaubere daran würde ich eher an einem anderen Punkt festmachen: In dem Sub-Vi, welches so beendet wird, findet ja überhaupt keine ordentliche Fehlerbehandlung statt. Es wird einfach vorausgesetzt, daß es in diesem SubVi keine Fehler gibt, außer dem Schließen der Queue durch das Haupt-Vi.
Ein ordentliche Fehlerbehandlung würde ich mir so vorstellen: Abfragen des Fehlers. Wenn es Schließen der Queue ist, Sub-VI beenden, andernfalls den Fehler über einen Melder an das Hautpt-VI senden, welches dann entscheiden soll, was zu geschehen hat.
|
|
|
21.10.2010, 21:11
(Dieser Beitrag wurde zuletzt bearbeitet: 21.10.2010 21:12 von macmarvin.)
Beitrag #5
|
|
|
22.10.2010, 07:51
Beitrag #6
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Erzeuger-Verbraucher-System beenden
Danke für die Antworten.
Da muss ich mal überlegen, was für mich das beste ist.
' schrieb:Ich würde auf jeden Fall ein spezielles Kommando zum Beenden vorsehen.
Wie soll man sonst einen Programmierfehler (aus Versehen irgendwo die Queue geschlossen bzw. verloren) von einem gewünschten Beenden unterscheiden?
Das funktioniert nach der NI-Methode schon, da dort der Fehler-Cluster am Eingang des Lesen-VIs nicht verbunden ist. Somit wird nur beendet, wenn im Lesen-VI ein Fehler aufgetreten ist. Da fragt man sich natürlich, wie sinnvoll das ist, da das VI trotz vorangegangenem Fehler ausgeführt wird.
|
|
|
22.10.2010, 10:28
Beitrag #7
|
|
|
25.10.2010, 12:22
(Dieser Beitrag wurde zuletzt bearbeitet: 25.10.2010 12:23 von Matze.)
Beitrag #8
|
Matze
LVF-Team
Beiträge: 1.027
Registriert seit: Apr 2010
20xx
2010
DE_EN
7xxxx
Deutschland
|
Erzeuger-Verbraucher-System beenden
Man könnte den Fehler-Cluster theoretisch auch mit dem VI "Keine Zahl/Kein Pfad/Keine Referenz?" prüfen und beim Wert "true" die Schleife beenden.
Wie ordentlich das ist, ist eine andere Frage.
Mir persönlich kommt es ordentlicher vor als den Fehler-Cluster zu verwenden.
|
|
|
25.10.2010, 12:42
(Dieser Beitrag wurde zuletzt bearbeitet: 25.10.2010 12:47 von dimitri84.)
Beitrag #9
|
|
|
25.10.2010, 13:11
|
IchSelbst
LVF-Guru
Beiträge: 3.689
Registriert seit: Feb 2005
11, 14, 15, 17, 18
-
DE
97437
Deutschland
|
Erzeuger-Verbraucher-System beenden
' schrieb:und kann mit einem reconnect-Versuch reagieren
Ist ein Reconnect in diesem Falle nicht ein sinnloses Feature? Nach dem Reconnect wäre wohl auf jeden Fall der Stopp-Befehl verloren. Sollte dann die MainApp den Stopp-Befehl wiederholen?
Im Falle, wenn die Queue-Referenz "plötzlich" weg ist, bleibt einem nur der Stopp der Gesamtapplikation. Solange man nicht weis, warum die Queuereferenz verschwunden ist, sind alle Gegenmaßnahmen (Reconnect) sinnlos. Über den Errorcluster den Consumer zu beendet, ist in der Entwicklungsphase sinnvoll. Da kann es schon mal vorkommen, dass die Referenz verloren geht. Hier wird man aber keinen Reconnect machen, sondern den Programmierfehler beheben.
Queue-Referenzen verschwinden normalerweise nicht in der Art, wie z.B. eine TCP/IP-Referenz. Die verschwindet, wenn der Anwender den Stecker zieht. Hier sollte normalerweise ein automatischer Reconnect her. Wie aber verschwindet eine Queue-Referenz?
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
|
|
|
| |