LabVIEWForum.de - Asynchron aufgerufene VIs sauber beenden

LabVIEWForum.de

Normale Version: Asynchron aufgerufene VIs sauber beenden
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
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.

[attachment=49708]
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) Angry.

[attachment=49709]
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!
Hallo NBG,

A) Ich verwende für solche Zwecke sehr gern FGVs. Du könntest dir eine programmieren, an der sich die Async-VIs "anmelden" und "abmelden". Vom MainVI aus kannst du abfragen, wieviele Instanzen gerade aktiv sind…
B) LabVIEW entfernt VIs aus dem Speicher, wenn sie inaktiv sind, das FP geschlossen wird und niemand mehr darauf zugreift (oder Referenzen offen hält). Da ich (wie in A geschrieben) FGVs zum Datenaustausch verwende, brauche ich keine Referenzen. Die Async-VIs schließen ihr FP selbständig, bevor sie beendet werden…

Zu deinem Test1: Warum kein Schieberegister, in dem die Referenzen gespeichert werden? Warum lokale Variablen?
Hallo GerdW,

dein Hinweis:
Zitat:LabVIEW entfernt VIs aus dem Speicher, wenn sie inaktiv sind, das FP geschlossen wird und niemand mehr darauf zugreift (oder Referenzen offen hält).
hat bei mir gerade zu der Erkenntnis geführt, dass ich bei meiner 2. Lösung (unteres Bild) ja tatsächlich ein "Referenz Schließen" fehlt.
Hab es ausprobiert, nun geht es.

Deine Idee mit der FGV gefällt mir ganz gut, ich denke ich werde auch eine Lade/Schließ FGV basteln. Allerdings würde mich Interessieren wie Dein Async-VI Sein FP selbstständig schließt, denn wenn Du den Methodenknoten FP.Schließen auf das AufruferVI anwendest, gibt es eine Fehlermeldung. Oder ist es so, dass das Async-VI sich bei der FGV abmeldet, und diese wiederum dann das Async-VI schließt (Hätte ich jetzt so gemacht)?

Gruß NBG
Hallo NBG,

Zitat:Interessieren wie Dein Async-VI Sein FP selbstständig schließt,
Man nimmt einfach die Property "FP.Status"?
[attachment=49713]
Ahhh... Danke!
(15.05.2014 09:44 )GerdW schrieb: [ -> ]Hallo NBG,

Zitat:Interessieren wie Dein Async-VI Sein FP selbstständig schließt,
Man nimmt einfach die Property "FP.Status"?

Reden wir hier von Schliessen oder Verstecken?? Zum Verstecken ist dieses Property sinnvoll, zum Schliessen sollte man aber doch echt den Methodenknoten FP.Close verwenden. Ansonsten bleibt das Frontpanel im Speicher und hält sich selber dadurch am Leben.
Ok, ich hätte ein besseres Beispiel heraussuchen sollen…
Aber der Grundgedanke bleibt: Referenz auf "Dieses VI" und dann das FP schließen!
Referenz-URLs