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!
26.07.2009, 10:22 (Dieser Beitrag wurde zuletzt bearbeitet: 26.07.2009 10:41 von Den.)
bitte um Hilfe! Im Rahmen eines Projektes muss ich ein Messprogramm erstellen, als Aufbaustruktur habe ich Erzeuger/Verbraucher-Struktur gewählt. Ich habe hier ein vereinfachtes Testprogramm hinzugefügt (siehe Abbildung und angehängte Datei).
Die Daten werden in der Erzeuger-Schleife produziert, dabei wächst die Queue ständig. Stoppt man die Erzeuger-Schleife, dann werden die Daten, die in Queue zwischen gespeichert sind, ordnungsgemäß abgearbeitet. Das Problem besteht darin, dass Verbraucher-Schleife dann auf die neue Daten wartet und man kann die nicht mehr stoppen und Queue freigeben.
Habt ihr irgendwelche Ideen, Lösungen?
Danke im Voraus
Viele Grüße
Den
Anzeige
26.07.2009, 12:56 (Dieser Beitrag wurde zuletzt bearbeitet: 26.07.2009 12:57 von eg.)
Drei Möglichkeiten (in allen 3 wird nur ein Stop-Button im Erzeuger verwendet):
1. Du beendest den Verbraucher, wenn du einen Fehler beim Lesen der Queue bekommst, dabei schleisst du die Queue dann, wenn der Producer beendet wird.
2. Du sendest nicht nur das Signal selbst, sondern noch einen Stop-Flag zum Verbraucher in einem Cluster. Der Typ der Queue ist damit ein Cluster aus Signal und booleschen Element.
3. Du machst deine Queue aus einem Cluster aus einem Befehl (oder auch State genannt) und einem "unbestimmten" Datentyp (z.B. String oder Variant). Dann reagierst du im Verbraucher abhängig vom Befehl: Daten oder Stop. Das nennt sich Queued State Machine und ist im Google zu finden (ich glaube bei expressionflow.com)
Es gibt noch die vierte Variante, von der ich aber abraten würde. Du machst einen kleinen Timeout beim Lesen der Queue, somit kannst du zwei Stopbuttons verwenden.
Du könntest alternativ auch eine zusätzliche Occurence verwenden, die dir das Ende der Erzeugerschleife darstellt (nach Beendigung der Schleife einfach die Occurence setzen). Ist dann aber in der Verbraucherschleife etwas mehr Arbeit, denn du willst ja sicherstellen, dass die Queue geleert wird.
@Falk, ich denke das wäre die letzte vierte Variante, nur halt mit Occurence, statt einem eigenem Beendenbutton. Ebenfalls muss man kleinen Timeour beim Lesen der Queue setzen, was nicht unbedingt gut ist, denn erstens muss man zusätzliche Case-Struktur in den Consumer einbauen, die Fehler/Nicht Fehler unterscheidet. Ausserdem kleine Timeouts sind nicht so gut für die CPU und Reaktionszeit beim Beenden zum Beispiel.
Wobei CPU Auslastung ist nicht kritisch.