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 

Dieses Thema hat akzeptierte Lösungen:

Parallele Schleife 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!

13.07.2015, 16:17
Beitrag #1

Klause Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Jul 2015

2014
2013
DE



Parallele Schleife beenden
Hallo zusammen,

erst einmal eine kurze Beschreibung meines VIs, dann zu meinem Problem. Mein Programm besitzt 3 parallelen Schleifen (1 für Datenerfassung bzw. Daten aus Datei lesen (Mitte), 1 zur Statusabfrage (unten) und 1 zur Datenauswertung (oben)). Die Daten lesen geht schneller als die Datenverarbeitung, was auch gut ist. Die Daten werden über eine Queue an die Datenauswertungsschleife übergeben und dort verarbeitet (hier der Einfachheit halber nur dargestellt). Diese und die Statusschleife sollen auch mal beendet werden. Die Schleife für die Daten endet, wenn das Dateiende (EOF) erreicht ist.


Ich habe ein Problem beim Offline-Modus. Die mittlere Schleife endet zwar und die anderen beiden laufen noch, bis die Daten in den Queues abgeholt sind, aber sie beenden sich dann nicht.

Statusschleife: Wird bisher erst beendet, wenn ein Fehler vorliegt oder auf "Stopp" gedrückt wird. Die soll dann später erst beendet werden, wenn die anderen beiden beendet sind. Das lässt sich ja auch wieder mit Queues bewerkstelligen.

Hauptschleife: Die boolschen Anzeigen "Queue leer?", "nicht mehr 1. Schleife?" und "Offline?" sind am Schluss alle TRUE. Aber "Final" leider nicht. Irgendwie hängt sich eine Schleife auf. Was kann ich da dagegen tun?

Auffällig: Die Statusschleifen und die Hauptschleife werden einmal mehr als die Datenschleife durchlaufen.

Viele Grüße
Klause.


14.0 .vi  Main.vi (Größe: 145,06 KB / Downloads: 314)



2.2 .tdms  Valsalva,10072015-LS-1.tdms (Größe: 2,54 MB / Downloads: 252)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.07.2015, 08:49
Beitrag #2

GerdW Offline
______________
LVF-Team

Beiträge: 17.469
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Parallele Schleife beenden
Hallo Klause,

so ziemlich alle Dequeue-Operationen werden ohne TimeOut aufgerufen - und können dadurch schon mal blockieren…

Abgesehen davon:
- Wozu brauchst du eine Eventstruktur, die nur ein Timeout-Event enthält, welches auf 0ms gesetzt ist? Vor allem, wenn darin Funktionen mit unbegrenztem TimeOut aufgerufen werden?
- Wozu steckt eine solche Eventstruktur in einer TWL, die mit 10ms Takt iterieren soll?

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.07.2015, 09:23
Beitrag #3

Klause Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Jul 2015

2014
2013
DE



RE: Parallele Schleife beenden
Hallo GerdW,

das ist nur eine Minimalversion meines Programms. In der Eventstruktur sind noch Werteänderungen von Buttons eingebaut, für Kalibrierungen und solche Geschichten. Die Hauptschleife wollte ich durch die zeitgesteuerte Schleife langsamer ablaufen lassen, da das Datensammeln an erster Stelle steht und die Verarbeitung Prozessorleistung braucht und durch die TWL die CPU schonen soll.

Den Timeout habe ich mal auf 20 ms gesetzt, das entspricht der gesamten Verarbeitungszeit.
Die TWL habe ich durch eine While-Schleife ersetzt.


14.0 .vi  Main.vi (Größe: 125,84 KB / Downloads: 263)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.07.2015, 10:11
Beitrag #4

GerdW Offline
______________
LVF-Team

Beiträge: 17.469
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Parallele Schleife beenden

Akzeptierte Lösung

Hallo Klause,

Zitat:Die mittlere Schleife endet zwar und die anderen beiden laufen noch, bis die Daten in den Queues abgeholt sind, aber sie beenden sich dann nicht.
Dann werden die Abbruchbedingungen noch nicht korrekt sein…

Zitat:Die boolschen Anzeigen "Queue leer?", "nicht mehr 1. Schleife?" und "Offline?" sind am Schluss alle TRUE. Aber "Final" leider nicht.
Und wie sehen die 3 Eingangswerte für die UND-Verknüpfung vor "Final" aus?

Wie schon gesagt: du arbeitest bei allen Dequeue-Funktionen ohne TimeOut - damit blockiert die Schleife, bis ein neues Element in die Queue geschrieben wird. Und wenn deine Datenschleife nichts mehr schreibt, bleibt die Auswerteschleife eben stehen. Dumm gelaufen, aber so hast du es programmiert!

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
14.07.2015, 11:52
Beitrag #5

Klause Offline
LVF-Neueinsteiger


Beiträge: 4
Registriert seit: Jul 2015

2014
2013
DE



RE: Parallele Schleife beenden
(14.07.2015 10:11 )GerdW schrieb:  Wie schon gesagt: du arbeitest bei allen Dequeue-Funktionen ohne TimeOut - damit blockiert die Schleife, bis ein neues Element in die Queue geschrieben wird. Und wenn deine Datenschleife nichts mehr schreibt, bleibt die Auswerteschleife eben stehen. Dumm gelaufen, aber so hast du es programmiert!

Danke, das hab ich nicht beachtet. Ich arbeite das erste Mal mit Queues. Ich hab überall einen Timeout eingebaut und in der Statusschleife den Timeout bei "Hauptschleife Element entfernen" mit dem OR-Gatter verbunden, der mir die Statusschleife schließt. "Hauptschleife Element entfernen" hat keine Werte mehr, und damit den Timeout, wenn die Hauptschleife beendet ist. Falls jemand mal das gleiche Problem hat: im Anhang ist das fertige VI.


Angehängte Datei(en)
14.0 .vi  Main.vi (Größe: 127,43 KB / Downloads: 277)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Gehe zu: