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 

Parallele Schleifen mit Queues richtig 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!

30.01.2012, 14:40
Beitrag #1

labrat Offline
LVF-Grünschnabel
*


Beiträge: 30
Registriert seit: Oct 2011

2011 DS2
2008
DE



Parallele Schleifen mit Queues richtig beenden
Hallo,

ich habe ein Programm, welches im Wesentlichen aus zwei parallelen While-Schleifen besteht. Während die erste Schleife dazu dient Daten einzulesen, ist die zweite Schleife für die Datenverarbeitung, graphische Darstellung usw. gedacht. Das Einlesen ist oftmals schneller als die Weiterverarbeitung. Aus diesem Grund findet der Transfer der Daten zwischen den Schleifen mit Hilfe der QUEUE-VIs statt. Das Prinzip funktioniert soweit.

Die Lese-Schleife läuft eine bestimmte Zeit (z.B. 5 Sekunden) und wird dann beendet. Wie kann ich nun die zweite Schleife dazu bringen ebenfalls zu stoppen? Und zwar so, dass die Anzahl der Schleifendurchläufe für beide While-Schleifen gleich groß ist. Momentan ist es nämlich so, dass die zweite Schleife immer einen Durchlauf mehr macht.

Ich habe versucht, das Problem im angehängten VI auf das Wesentliche zu reduzieren.

Vielen Dank schonmal


Angehängte Datei(en)
8.0 .vi  Queue.vi (Größe: 39,37 KB / Downloads: 293)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.01.2012, 14:49
Beitrag #2

Hook1986 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 149
Registriert seit: Jan 2012

2010
2011
DE_EN


Deutschland
RE: Parallele Schleifen mit Queues richtig beenden
Hallo Labrat,

zuerst mal eine kleine Frage. Wieso sollen denn die beiden Schleifen genau gleich oft druchlaufen werden? Eventuell wäre das Producer-Consumer Pattern für dich sehr hilfreich sein. Wenn du dann nicht "nur" die Daten, sondern auch noch Steuerbefehle und in der zweiten Schleife eine Case-Struktur verwendest, dann könntest du auch beide Schleifen beenden.

MfG Carsten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.01.2012, 14:51 (Dieser Beitrag wurde zuletzt bearbeitet: 30.01.2012 14:55 von NWOmason.)
Beitrag #3

NWOmason Offline
Simultator
*****


Beiträge: 1.078
Registriert seit: Dec 2010

2012.SP1
2008
EN

93047
Deutschland
RE: Parallele Schleifen mit Queues richtig beenden
Hallo,

einfach abfragen, ob noch ein Wert gesendet werden soll, oder nicht:

   

Die Queue musst du auch nur 1mal destroyen Wink

Generell sei hier auf das Producer-Consumer-Design-Pattern verwiesen.




Beste Grüße,
NWO

9 von 10 Stimmen in meinem Kopf sagen: Ich bin nicht verrückt,
die andere summt die Melodie von Tetris
.

NI schrieb:To use the abort button is like using a tree to stop a car!

(20.01.2012 11:02 )NWOmason schrieb:  Getting Started with NI LabVIEW Student Training
http://zone.ni.com/devzone/cda/tut/p/id/7466

Introduction to NI LabVIEW - Learn LabVIEW Basics
http://www.ni.com/gettingstarted/labviewbasics/

Top 5 der Empfehlungen für LabVIEW-Einsteiger
http://www.ni.com/newsletter/51735/de/
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.01.2012, 14:54
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
RE: Parallele Schleifen mit Queues richtig beenden
Wenn du die "Speicher-Schleife" dadurch abbrechen willst, dass du die Queue zerstörst und somit der Fehler einen Abbruch der Schleife erzeugt, dann ist das ein durchaus übliches Vorgehen. Und dann ist es auch völlig normal, dass du in der "Speicher-Schleife" einen Durchlauf mehr hast, nämlich den Durchlauf, der dir einen Fehler ausgibt.

Allerdings würde ich noch eine Fehlerbehandlung einbauen. Nur wenn kein Fehler vorliegt, wird eine Verarbeitung der Daten vorgenommen, ansonsten nicht. In etwa so:

   

Ansonsten, s. oben.

Gruß, Jens

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30.01.2012, 15:27 (Dieser Beitrag wurde zuletzt bearbeitet: 31.01.2012 15:42 von Lucki.)
Beitrag #5

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

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: Parallele Schleifen mit Queues richtig beenden
Beim Vorshlag von NWO hat man zwar die gleiche Anzahl von Schleifendurchläufen, aber ansonten ist es suboptimal:
Bei 10 Schleifendurchläufen werden 9 Werte gesendet, aber außer diesen 9 Werten wird unten noch 1 ungültiger Wert "0" empfangen.
Schließe mich dem Vorschlag von Jens an. Wirklich professionell ist die Methode sowieso nicht, aber es ist einfach und funktioniert. So ein kleiner Nebeneffekt muß da eben in Kauf genommen werden.
Weitere Unschönheiten des VIs sind: (a) das überflüssige Wait in der unteren Schleife, (b) das zweite Zerstören der Queue an der unteren Schleife, nachdem das an der oberen Schleife schon passiert ist.

   

Edit: Falls es interessiert. Hier noch das entsprechende "Profi"-Beispiel, bei dem alles so funktioniert wie es sollte - keine unterschiedlichen Schleifenanzahlen, keine Case-Unterscheidung von gültigen und ungültigen Daten, keine missbrauchten Errormeldungen.
   

11.0 .vi  Queue.vi (Größe: 28,2 KB / Downloads: 238)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
31.01.2012, 14:45
Beitrag #6

labrat Offline
LVF-Grünschnabel
*


Beiträge: 30
Registriert seit: Oct 2011

2011 DS2
2008
DE



RE: Parallele Schleifen mit Queues richtig beenden
Vielen Dank für eure Vorschläge. ich habe alle getestet (sogar die Profi-Lösung), leider ohne Erfolg. Um mein Problem zu schildern muss ich etwas weiter ausholen. Im Prinzip geht es um Bildbearbeitung. Die erste Schleife dient dazu ein Bild von einer Kamera zu holen; die zweite Schleife zur Bildbearbeitung. Die beide Schleifen müssen gleich oft durchlaufen werden, da ich sonst beim letzen - und nur beim letzten - Schleifendurchlauf in der Bearbeitungs-Schleife folgende Fehlermeldung bekomme:

"Fehler 1 bei Element aus Queue entfernen"
"NI Vision: Kein Bild"

Es scheint fast so, als ob die zweite Schleife die erste überholen würde. Ist das überhaupt möglich?

Ich habe versucht, im angehängten VI das Problem wieder auf das Wesentliche zu reduzieren. Leider ist dafür jedoch das NI Vision Modul erforderlich.

Anmerkung: Mir ist klar, dass ein Schleifendurchlauf ohne Zeitverzögerung immer kritisch zu beäugen ist, jedoch konnte ich in dieser abgespeckten Version nur so den/die Fehler rekonstruieren. Im Original-Programm habe ich bereits verschiedene Varianten mit Verzögerungen ausprobiert. Alle ohne Erfolg

Vielen Dank für eure Hilfe


Angehängte Datei(en) Thumbnail(s)
   

11.0 .vi  Queue_Fehler.vi (Größe: 63,16 KB / Downloads: 180)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
31.01.2012, 15:47 (Dieser Beitrag wurde zuletzt bearbeitet: 31.01.2012 16:00 von Lucki.)
Beitrag #7

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

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
RE: Parallele Schleifen mit Queues richtig beenden
Habe in meinen letzten Beitrag das VI noch angehängt.
So wie Du es hast kann es nicht funktionieren: Die Queue wird wahrscheinlich (Wettlaufeffekt) zerstört, bevor die untere Schleife das letzte Mal ausgeführt wird. Also "Queue beenden" an die untere Schleife anhängen!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
31.01.2012, 17:14
Beitrag #8

Ome Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 109
Registriert seit: Nov 2009

2011
2009
DE

12XXX
Deutschland
RE: Parallele Schleifen mit Queues richtig beenden
Hi,

wenn du die Fehler zusammenführst klappt alles so wie du willst.

Gruß Ome


Angehängte Datei(en)
11.0 .vi  Queue_Fehler.vi (Größe: 27,61 KB / Downloads: 222)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
31.01.2012, 18:10
Beitrag #9

labrat Offline
LVF-Grünschnabel
*


Beiträge: 30
Registriert seit: Oct 2011

2011 DS2
2008
DE



RE: Parallele Schleifen mit Queues richtig beenden
Ah Ok, vielen Dank. Ich glaube man merkt, dass ich zum ersten mal mit Queues arbeite. Inzwischen konnte ich jedoch eine merkwürdige Beobachtung machen:

Ich habe die erste While-Schleife durch eine for-Schleife ersetzt, sodass beide 500mal durchlaufen werden. In der zweiten Schleife habe ich eine Verzögerung eingebaut, sodass diese deutlich langsamer läuft als die Erste. Dies entspricht auch den Verhältnissen in meinem Hauptprogramm. Nun habe ich festgestellt, dass ab dem Zeitpunkt, wenn die 1. Schleife beendet ist in der zweiten keine Bilder mehr aus dem Queue geholt. D.h. es wurden insgesamt 500 Bilder in den Queue geschrieben, es werden aber nur ca. 200 Bilder in der zweiten Schleife ausgelesen. Die zweite Schleife läuft zwar auch noch die restlichen 300 Iterationen durch, holt aber keine Bilder mehr aus dem Queue. Testweise habe ich noch neben den Bildern auch noch Zufallszahlen in den Queue geschrieben, welche auch problemlos bis zum Ende ausgelesen werden.

Kurz: Für Zahlen, Boolsche Werte usw. funktioniert die Übertragung mit Queues einwandfrei. Nur mit Bildern nicht. Kann das sein?
Hat jemand eine Erklärung dafür? Oder noch besser: Eine Lösung!

schöne Grüße

labrat


Angehängte Datei(en) Thumbnail(s)
   

11.0 .vi  Image Queue.vi (Größe: 58,36 KB / Downloads: 192)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
31.01.2012, 18:55
Beitrag #10

Hook1986 Offline
LVF-Gelegenheitsschreiber
**


Beiträge: 149
Registriert seit: Jan 2012

2010
2011
DE_EN


Deutschland
RE: Parallele Schleifen mit Queues richtig beenden
Hallo Labrat,

bei Images ist es so, dass du nicht die Bilddaten sondern eine Referenz auf die Bilddaten in die Queue schreibst. Daher gehen die Daten der Bilder verloren. Eine mögliche Abstellmaßnahme wäre, dass du in deiner For-Schleife aus dem Bild ein Array machst und tatsächlich die Daten des Bildes in die Queue reinfeuerst.

Bei Images wird nicht wie bei LabVIEW üblich ein Call by Reference ausgeführt und kein Call by Value.

MfG Carsten
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
30
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Parallele Frequenz-Datenerfassung mit NI-9401 ArneS 5 2.968 18.02.2021 09:41
Letzter Beitrag: GerdW
  2 Parallele While-Schleifen mit unterschiedlichen Timer beenden Tomate27 3 2.431 18.08.2020 13:29
Letzter Beitrag: GerdW
  parallele Ausführung von for-loops stsc 5 4.224 24.07.2019 15:12
Letzter Beitrag: stsc
  Probleme mit Queues und Programmaufbau stefan1312 6 4.502 30.10.2018 17:08
Letzter Beitrag: NoWay
  Drei Queues in einer While-Schleife mit case-Struktur EinVolvic 12 11.180 17.05.2017 20:25
Letzter Beitrag: EinVolvic
  Verschachtelte und parallele Schleifen gleichzeitig beenden Rayid 6 6.412 14.11.2016 08:24
Letzter Beitrag: GerdW

Gehe zu: