LabVIEWForum.de - Producer/Consumer endet zu früh

LabVIEWForum.de

Normale Version: Producer/Consumer endet zu früh
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

ich versuche grade, mittels des Producer-Consumer-Konzeptes ein Programm zusammenzustellen.

Leider funktionieren die Queues nicht ganz wie erwartet: producerseitig würde ich gerne dem Consumer eine Art EOF kommunizieren, aber so, daß dieser alle Daten bekommt.

Wenn aber, wie in den Beispielen, direkt nach Beendigung des Producers die Queue geschlossen wird und die noch in der Queue verbliebenen Elemente dem Producer beim Schließen zurückgegeben werden, ist das nicht ganz mein Ziel, weil der Consumer davon ja nichts mitbekommt.

Aus diesem Grund habe ich zwischen Ende der Producer-Schleife und Schließen der Queue eine Warteschleife eingefügt, die wartet, bis der Consumer die Queue abgearbeitet hat und dann erst die Queue schließt. Nun kommt mir das aber nicht ganz sauber vor - oder liege ich da falsch?

Ein Bild sagt mehr als 1000 Worte, daher habe ich mein Test-VI mal angehängt.

Der Producer schiebt im 50-ms-Abstand 40 Werte in die Queue, der Consumer holt sie im 150-ms-Abstand ab und zeigt sie nacheinander an. Ohne genannte Schleife kommen die verbliebenen Werte beim Schließen heraus (klar), mit der Warteschleife läuft es wie gewünscht.

Nun meine Frage: Gibt es eine bessere Möglichkeit? Wie würdet ihr da herangehen?[attachment=36415]
Bei diesem sehr einfachen Bsp würde ich in der Warteschleife nachschauen, ob noch Elemente in der Queue sind. Wenn leer, dann offenbar Consumer fertig, und die Queue darf zerstört werden.

Aufwändiger: Die Queue enthält neben Daten noch Befehle, das Übergabeelement ist dann ein Cluster. Dann kann der Consumer sauber abgebrochen werden, und erst wenn beide Schleifen fertig sind, wird die Queue zerstört.

Gruß, Jens
(11.10.2011 09:29 )jg schrieb: [ -> ]Bei diesem sehr einfachen Bsp würde ich in der Warteschleife nachschauen, ob noch Elemente in der Queue sind. Wenn leer, dann offenbar Consumer fertig, und die Queue darf zerstört werden.

Aufwändiger: Die Queue enthält neben Daten noch Befehle, das Übergabeelement ist dann ein Cluster. Dann kann der Consumer sauber abgebrochen werden, und erst wenn beide Schleifen fertig sind, wird die Queue zerstört.

Gruß, Jens

Perfekt, danke schön, genauso hab ichs jetzt gemacht (1. Lösung).
Referenz-URLs