LabVIEWForum.de
Parallele Schleife beenden - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: Datenkommunikation (/Forum-Datenkommunikation)
+---- Thema: Parallele Schleife beenden (/Thread-Parallele-Schleife-beenden)



Parallele Schleife beenden - Klause - 13.07.2015 16:17

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.

[attachment=53599]

[attachment=53600]


RE: Parallele Schleife beenden - GerdW - 14.07.2015 08:49

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?


RE: Parallele Schleife beenden - Klause - 14.07.2015 09:23

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.

[attachment=53605]


RE: Parallele Schleife beenden - GerdW - 14.07.2015 10:11

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!


RE: Parallele Schleife beenden - Klause - 14.07.2015 11:52

(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.