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 

Erzeuger-Verbraucher-System beenden



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!

21.10.2010, 08:53
Beitrag #1

Matze Offline
LVF-Team
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

Grüße
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
21.10.2010, 09:02
Beitrag #2

Morpheus Offline
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.10.2010, 09:03
Beitrag #3

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.696
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).
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.10.2010, 13:58 (Dieser Beitrag wurde zuletzt bearbeitet: 21.10.2010 14:02 von Lucki.)
Beitrag #4

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
21.10.2010, 21:11 (Dieser Beitrag wurde zuletzt bearbeitet: 21.10.2010 21:12 von macmarvin.)
Beitrag #5

macmarvin Offline
CLA
***


Beiträge: 445
Registriert seit: Sep 2006

2014
2004
EN

81373
Deutschland
Erzeuger-Verbraucher-System beenden
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?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
22.10.2010, 07:51
Beitrag #6

Matze Offline
LVF-Team
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.

   

Grüße
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
22.10.2010, 10:28
Beitrag #7

macmarvin Offline
CLA
***


Beiträge: 445
Registriert seit: Sep 2006

2014
2004
EN

81373
Deutschland
Erzeuger-Verbraucher-System beenden
' schrieb: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.


Nö... unterscheiden kannst du es eben nicht, ob du willentlich oder aus versehen die Schleife beendet hast, weil die Referenz futsch ist (weil Programmierfehler oder LV-Bug (z.B. CAR 136680). Der Fehlereingang ist unerheblich.
Insgesamt würde ich das implizite Beenden als schlechten Stil einstufen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.10.2010, 12:22 (Dieser Beitrag wurde zuletzt bearbeitet: 25.10.2010 12:23 von Matze.)
Beitrag #8

Matze Offline
LVF-Team
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.

   

Grüße
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.10.2010, 12:42 (Dieser Beitrag wurde zuletzt bearbeitet: 25.10.2010 12:47 von dimitri84.)
Beitrag #9

dimitri84 Offline
Astronaut
*****


Beiträge: 1.496
Registriert seit: Aug 2009

2020 Developer Suite
2009
DE_EN

53562
Deutschland
Erzeuger-Verbraucher-System beenden
' schrieb: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.
Hm?
   
Wie man den Status im Fehler-Cluster ermittelt ist Wurst. Es geht darum, dass eine Queue-Ref auch mal verschwinden kann, nicht weil sie ordnungsgemäß geschlossen wurde, sondern weil an anderer Stelle etwas schief ging. Bei der impliziten Methode stoppt der Verbraucher einfach. Bei der expliziten Methode erkennt der Verbraucher, dass etwas nicht stimmt (fehlender Stopp-Befehl!) und kann mit einem reconnect-Versuch reagieren - Fehlerbehandlung.



Gruß dimitri

„Sag nicht alles, was du weißt, aber wisse immer, was du sagst.“ (Matthias Claudius)
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
25.10.2010, 13:11
Beitrag #10

IchSelbst Offline
LVF-Guru
*****


Beiträge: 3.696
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).
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
  Protokolieren durch TDMS in einer Erzeuger und Verbraucher Synchronisation Atlaspremier 0 2.713 28.07.2016 13:21
Letzter Beitrag: Atlaspremier
  NI System API RT and NI System API Windows 32 bit, helm 1 3.425 11.12.2015 13:30
Letzter Beitrag: GerdW
  Erzeuger-Verbraucher Muster Abbruch Verbraucherschleife mit Abarbeitung der Queue lumaxo 5 6.706 12.02.2015 13:55
Letzter Beitrag: Lucki
  Erzeuger/Verbraucher Schleife mit mehreren Verbrauchern LV-Fred 4 5.924 08.06.2012 15:58
Letzter Beitrag: Kiesch
  Erzeuger-Verbraucher Entwurfsmuster und Errorcluster wernerIBN 15 15.801 30.06.2010 13:29
Letzter Beitrag: Matze
  Design "Erzeuger/Verbraucher wernerIBN 11 13.560 07.10.2009 10:27
Letzter Beitrag: wernerIBN

Gehe zu: