INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Asynchron aufgerufene VIs sauber beenden



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!

15.05.2014, 07:40 (Dieser Beitrag wurde zuletzt bearbeitet: 15.05.2014 08:34 von GerdW.)
Beitrag #1

NBG Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Feb 2011

2010
2009
DE



Asynchron aufgerufene VIs sauber beenden
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) Angry.

   
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!


Angehängte Datei(en)
0.0 .zip  Test1.zip (Größe: 58,65 KB / Downloads: 195)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
15.05.2014, 07:53 (Dieser Beitrag wurde zuletzt bearbeitet: 15.05.2014 08:17 von GerdW.)
Beitrag #2

GerdW Offline
______________
LVF-Team

Beiträge: 17.467
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Asynchron aufgerufene VIs sauber beenden
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?

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.05.2014, 09:31 (Dieser Beitrag wurde zuletzt bearbeitet: 15.05.2014 09:32 von NBG.)
Beitrag #3

NBG Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Feb 2011

2010
2009
DE



RE: Asynchron aufgerufene VIs sauber beenden
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.05.2014, 09:44
Beitrag #4

GerdW Offline
______________
LVF-Team

Beiträge: 17.467
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Asynchron aufgerufene VIs sauber beenden
Hallo NBG,

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

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.05.2014, 09:57
Beitrag #5

NBG Offline
LVF-Neueinsteiger


Beiträge: 3
Registriert seit: Feb 2011

2010
2009
DE



Wink RE: Asynchron aufgerufene VIs sauber beenden
Ahhh... Danke!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.05.2014, 10:36
Beitrag #6

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
RE: Asynchron aufgerufene VIs sauber beenden
(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.

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
15.05.2014, 11:40
Beitrag #7

GerdW Offline
______________
LVF-Team

Beiträge: 17.467
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
RE: Asynchron aufgerufene VIs sauber beenden
Ok, ich hätte ein besseres Beispiel heraussuchen sollen…
Aber der Grundgedanke bleibt: Referenz auf "Dieses VI" und dann das FP schließen!

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Aufgerufene SubVI nicht bedienbar L@BTR0N 2 4.133 02.03.2020 13:39
Letzter Beitrag: L@BTR0N
  Wie kann man Lokale Variablen sauber verpacken? Tobzn 10 7.764 04.03.2018 12:02
Letzter Beitrag: IchSelbst
  Error 1576 bei asynchron gestartetem VI Walter_H 2 3.950 06.03.2013 14:33
Letzter Beitrag: Walter_H
  asynchron VIT Instanz nach beenden schliessen GT123 4 5.273 11.06.2012 08:03
Letzter Beitrag: rolfk
  Phasenverschiebung und Triggersignal nicht sauber krys 2 4.954 24.01.2008 22:26
Letzter Beitrag: dc6xs
  LV sauber mit WM_Quit beenden eg 4 4.215 07.06.2006 12:57
Letzter Beitrag: eg

Gehe zu: