Hallo,
ich habe eine Frage, zum sauberen schließen (sauber = mit Speicherfreigabe) von Asynchron aufgerufener VIs.
Hintergrund ist der, dass ich ein Programm geschrieben habe, welches VIs Asynchron aufruft mit dem Methodenknoten "VI ausführen" und später wieder schließe (schließen = VI abarbeitet und im Methodenknoten Ref. automatisch schließen auf true gesetzt).
Mir viel dann aber auf, dass je öfter ich dieses dynamische öffnen und schließen durchführe, meine Anwendung immer langsamer wurde.
Also habe ich mir ein folgendes Test VI geschrieben:
Zwei Buttons, mit dem einem Öffne ich Instanzen des SubVIs und mit dem anderen schließe ich sie wieder (nach oben beschriebenem verfahen).
Nun habe ich vier mal auf Open gedrückt, und es erschienen 4 subVIs mit namen Instanz.vi:1 bis Instanz.vi:4. Anschließen betätige ich zwei mal Close, so dass Instanz.vi:1 und 2 beendet worden sind (Waren aber aber noch sichtbar). Dann habe ich wieder zwei mal auf Open gedrückt und es erschiehnen Instanz.vi:5 und 6. Für mich also das Zeichen: Es wurden neue Instanzen erzeugt. also Habe ich nach dem beenden (beenden = komplett abarbeitet) des SubVIs noch den Methodenknoten "FP.Schließen" angehängt. Dies führte jedoch logischerweise zu einem Fehler, da im Methodenknoten "VI ausführen" ja noch die Option "Ref automatisch schließen" aktiv war. Also ich den Property auf False gesetzt und obrigen Testlauf nochmal durchgegangen. Siehe da, nachdem 2 der 4 Instanzen geschlossen wurden, Sind sie schonmal von der Bildflächer verschwunden. Nachdem nun zwei neue erzeugt wurden bekam diese den namen Instanz.vi:1 und 2 (und nicht 5 und 6). Super, dann hatte ich aber ein anderes Problem! Denn in meinem Ursprünglichen Programm werden die SubVIs per "Elementwert Festlegen" Methodenknoten beendet und im nächsten schritt wird eine Schleife durchlaufen die Sämtliche Referenzen auf NULL überprüft. Wenn dann alle Referenzen geschlossen sind, weis ich, das alle SubVIs beendet worden sind. Hierzu ist aber die Einstellung "Ref. automatisch schließen nötig". Also habe ich es mit dem Eigenschaftsknoten "Ausführung.Status" Probiert, der steht aber komischerweise immer auf Running.
Test1
Nun fiel mir ein, dass es ja in der neuen LV version ein neues VI gibt dass da heißt "Asynchron Aufruf starten" und "Asynchron Aufruf warten". Also habe ich mein Testprogramm dahin gehen geändert, dass anstelle des Methodenknoten "VI ausführen" das VI "Asynchron Aufruf starten" ausgeführt wird und beim beeneden des SubVIs "Asynchron Aufruf warten" ausgeführt wird (gefolgt von FP.schließen). Als ich dann aber mein Test wieder durchgeführt habe stellte sich raus, dass beim erzeugen meiner Instanzen wieder hochgezählt wurde (Instanz.vi:5 und 6)
.
Test2
Schön währen jetzt Lösungvorschläge entweder:
A: Wie kann ich feststellen ob mein SubVI noch läuft (Eine Lösung von wegen am Ender der VI ausführung ne lokale variable setzen und dann von Aussen abfragen fände ich jetzt nicht so prall).
oder
B: Wie kann ich dafür sorgen, dass bei Benutzung der VIs "Asynchron Aufruf starten" und "Asynchron Aufruf warten" nach dem Warten und FP.schließen die Instanz WIRKLICH geschlossen ist.
Vielen dank und frohes schaffen...
Edit GerdW: Bilder immer im Forum hochladen! Und schon gar nicht auf Servern mit so unanständigen Namen!