LabVIEWForum.de
doppelte while-Schleife geschickt beenden - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: doppelte while-Schleife geschickt beenden (/Thread-doppelte-while-Schleife-geschickt-beenden)



doppelte while-Schleife geschickt beenden - Hasenfuss - 08.04.2013 19:24

Wie kann ich eine while-Schleife geschickt beenden?

Ich habe zwei while-Schleifen. Die äussere Schleife wird durch den Melder "Beenden" gesteuert. Innerhalb dieser Schleife befindet sich ein weiterer Prozess, der gestartet oder beendet werden kann ("Melder 1").

Melder 1 kann die innere Schleife beenden, wird aber auch verwendet, um die while-Schleife wieder zu starten (z. Könnten in diesem Prozess Daten abgespeichert werden). Um Pollen zu vermeiden, habe ich die Funktion "Auf Meldung warten..." genommen und "vorige ignorieren = true" gesetzt, damit die Schleife nicht pollt. Beim Beenden des Programms werden die Melder "Beenden = True" gesetzt, um die äussere Schleife zu beenden und der Melder1 = false, um Aufzeichnung zu beenden. Nun bleibt die Schleife aber hängen, da die Funktion "Auf Meldung warten..." noch aktiv ist.

Ich könnte jetzt in der Prozedur "Programm beenden" zweimal den Melder auf false setzen, einmal zum Beenden der inneren Schleife, falls die noch aktiv ist, und dann ein zweites Mal, dass die Funktion "auf Melder warten..." nochmal ausgelöst wird mit dem Wert false, damit beide Schleifen dann geschlossen werden. Der false-case zum Abfragen, ob Melder1=true/false ist leer.

Wäre meine Lösung mit doppeltem Setzen von Melder1=false eine brauchbare Lösung oder gibt es vielleicht bessere Möglichkeiten?


RE: doppelte while-Schleife geschickt beenden - Hasenfuss - 08.04.2013 19:59

Folgende Variante funktioniert auch nicht:

In der Beendenprozedur wird nach dem Setzen von Melder1 = true Melder1 freigegeben.

Eigentlich müsste die Funktion etwas weiter oben mit "warte auf Meldung..." abbrechen, da der Melder freigegeben wurde - tut die Funktion aber nicht, sie wartet fleissig immer weiter ...


RE: doppelte while-Schleife geschickt beenden - jg - 08.04.2013 20:24

Du hast 2 "unabhängige" Referenzen auf denselben Melder erzeugt.

Grundregel: Pro Obtain braucht es üblicherweise ein Close/Destroy.
Ausnahme: Du erzwingst durch ein TRUE die Zerstörung aller Referenzen.

Gruß, Jens


RE: doppelte while-Schleife geschickt beenden - Hasenfuss - 08.04.2013 21:12

Hallo Jens,

vielen Dank fuer Deine Antwort.

Ich verstehe Deine Antwort grad noch nicht. Bedeutet die Funktion "Melder freigeben" nicht "close/destroy"?

Ich wollte die Melder so nicht dierekt miteinander verbinden. Je komplexer ein Programm wird und je mehr Melder und Queues man hat - das wird im laufe der Zeit immer unübersichtlicher.

Ich war bisher der Meinung halt - gebe ich den Melder an einer Stelle frei - z.B. auch zwischen zwei VIs - dann bricht die Funktion in dem anderen VI auch ab. Bei Queues funktioniert es zumindest so, also dachte ich - bei Meldern geht es auch.

Wäre dieser Ansatz so mit einer Konstanten und Variablen eine "bessere" Lösung?


RE: doppelte while-Schleife geschickt beenden - jg - 08.04.2013 21:22

Read the Manual!. Ohne ein True an "Force Destroy" wird nur die aktuelle Notifier bzw. Queue Refnum geschlossen.

Und wenn du eine Notifier oder QueueRefnum mal innerhalb einer gesamten Applikation verteilen willst, dann ist eher eine FGV das Mittel der Wahl.
Wenn du Race-Conditions auschließen kannst, dann ist eine lokale Variable IMHO durchaus eine legitime Möglichkeit, auch wenn es dem offiziellen LabVIEW Style Guide widerspricht.

Gruß, Jens


RE: doppelte while-Schleife geschickt beenden - Hasenfuss - 08.04.2013 21:40

Herzlichen Dank für Deine Geduld. Ich habe zuerst nicht kapiert, was Du mit True an "force destroy" meintest. Ein Problem sind manchmal auch die unterschiedlichen Bezeichnungen auf deutsch/englisch. Vielleicht ist es sinnvoller, die deutsche Version runterzuschmeissen und mt der englischen Variante weiterzuarbeiten, um sich daran zu gewöhnen. Aber echt nochmal ein riesengroßes Dankeschön.