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!
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?
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 ...
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?
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
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!
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.