LabVIEWForum.de
Muss man Referenzen schließen? - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Muss man Referenzen schließen? (/Thread-Muss-man-Referenzen-schliessen)

Seiten: 1 2 3


Muss man Referenzen schließen? - dimitri84 - 22.02.2010 15:19

Einwand zur Kenntnis genommen und akzeptiert.


Muss man Referenzen schließen? - SeBa - 22.02.2010 16:18

' schrieb:...
Auch für eine "VI-Referenz" wie von SeBa angegeben gilt im Prinzip das selbe. Nur ist es hier noch schlimmer: Würde man die Referenz löschen - sollte eigentlich das Objekt gelöscht werden: Das VI wäre dann also verschwunden.
...

Und weil LV clever ist ignoriert es meine Auffordeung zum Löschen der Referenz bis das VI beendet wird und die Referenz sowieso geschlossen werden würde.Big Grin

Das Schließen solcher Referenzen tut also keinem weh, schadet aber auch nicht.
Speicher wird für solche Referenzen nur einmal alloziert, in Schleifen wird immer auf diese eine Referenz verwiesen (zusätzlicher Speicher wird also nicht alloziert).


Ich glaub ich habs kapiert.


Gruß SeBa


Muss man Referenzen schließen? - IchSelbst - 22.02.2010 17:33

' schrieb:Das Schließen solcher Referenzen tut also keinem weh, schadet aber auch nicht.
Das ist Standpunktssache. Kannst du mal kucken, was der Errorausgang des Close sagt, wenn du eine VI-Referenz schließt? Dumm wäre, wenn einer den Errorcluster sequenziert hat ...


Muss man Referenzen schließen? - Y-P - 22.02.2010 17:42

Hab's getestet. Das macht gar nichts aus. Unsure

Gruß Markus

' schrieb:Kannst du mal kucken, was der Errorausgang des Close sagt, wenn du eine VI-Referenz schließt?



Muss man Referenzen schließen? - Kiesch - 26.02.2010 11:44

Daher aber mal kurz gesagt: Das Schlimmste was mir passieren kann ist, dass mir der Speicher ausgeht und das VI sich deshalb aufhängt (?).


Muss man Referenzen schließen? - IchSelbst - 26.02.2010 12:10

' schrieb:Das Schlimmste was mir passieren kann ist, dass mir der Speicher ausgeht und das VI sich deshalb aufhängt (?).
Ob das als das Schlimmste bezeichnet werden kann, ist fraglich. Wäre dem so, wäre das eher gut.

Auftreten werden zuerst einmal andere Effekte: Die Laufzeiten diverser paralleler Loops werden sich vergrößern - ohne dass das jemand merkt. D.h. die Prozessorzeit steigt (Das Betriebssystem muss ggf. eine Handle-Liste durchgehen, was bei 1Mio Handle doch etwas dauert). Das hat auch zur Folge, dass diverse Puffer (Queues, Melder) überlaufen können und Daten verloren gehen - und auch das keiner merkt. Dann können einzelne parallele VIs abstürzen - andere werden aber weiterlaufen.

Alles Probleme, die ich als schlimmer erachte als den Absturz der ganzen Applikation.


Muss man Referenzen schließen? - Kiesch - 26.02.2010 12:28

Ich würde das auch als schlimmer erachten - deswegen ja die Frage. Wenn ich mir nur Speicher blockiere sehe ich halt nur das Problem Komplettabsturz oder langsam werden (langsame Ausführung ist ja prinzipiell verkraft und bemerkbar - aber gut zu wissen woran das auch liegen kann).

Die Auswirkungen sollten aber zumindest auf das VI beschränkt bleiben?


Muss man Referenzen schließen? - IchSelbst - 26.02.2010 13:05

' schrieb:Die Auswirkungen sollten aber zumindest auf das VI beschränkt bleiben?
Nein, normalerweise nicht.

Ein VI kann prinzipiell wie ein eigenständiger Prozess betrachtet werden. So gesehen würde eine Beschränkung auf nur das eine VI naheliegen. VIs sind aber untereinander gekoppelt - und zwar mindestens über den Speichermanager (der sich in der LV-Runtime befindet). Blockiert nun ein VI den Speichermanager, so beeinflusst das automatisch alle anderen VIs. Die können nämlich nicht mehr auf den Speichermanager zugreifen, wenn der gerade blockiert ist. Ähnliche Verhaltensweisen treten auch bei anderen, VI-übergreifenden Strukturen auf (z.B. Synchronisationsmethoden).

Es kann natürlich Fälle geben, in denen die Auwirkungen auf nur ein VI beschränkt bleiben. Nichtsdestoweniger muss man aber wissen, dass es auch anders sein könnte.


RE: Muss man Referenzen schließen? - GT123 - 02.02.2012 07:03

Hallo allerseits,

ich habe mich hier zu dem Thema eingelesen, bin mir aber nicht bei allem ganz sicher.
Ausserdem tritt bei meiner Applikation ein Fehler auf beim Beenden eines Vis welches in einem Subpanel
geladen wurden (Dialog -> Resetting VI: xy.vi dann hängt sich alles auf u. man muss LV abschiessen).
Da dieser Fehler nur bei längerer Laufzeit auftritt, kann ich mir gut vorstellen das ich mir evtl. den Speicher mit
Referenzen "zu müll".

Ich habe mal ein Bsp. Vi angehängt mir zwei Schleifen und würde mich freuen wenn ihr mir hierzu wenn
nötig Verbesserungsvorschläge gebt, nur was das mit den Referenzen angeht, die Funktion des Vis ist
ja nicht gegeben.

Beispiel1:
Wenn ich innerhalb einer Schleife die Referenz benutze kann ich das doch ohnen SR tun?
Es bleibt immer die gleiche Referenz, schliessen nur nach beenden der Schleife?

Beispiel2:
Wenn ich eine Ref. einer Eigenschaftfunktion schliesse (XScale.ScaleFit) ist dann die Ref nur für diese
Funktion gelöscht oder die ganze Ref. des XY Graph?

Denn ich verstehe das so: eine Ref. ist ein Zeiger, beim schliessen wird die Speicherzuweisung gelöscht.

Ich hoffe ihr könnt mir hier weiterhelfen.


RE: Muss man Referenzen schließen? - Falk - 02.02.2012 09:27

(02.02.2012 07:03 )GT123 schrieb:  Beispiel1:
Wenn ich innerhalb einer Schleife die Referenz benutze kann ich das doch ohnen SR tun?
Es bleibt immer die gleiche Referenz, schliessen nur nach beenden der Schleife?

Soweit richtig, aber man sollte gerade bei einer For-Schleife immer folgenden Fall berücksichtigen. Was ist wenn die Schleife genau 0x ausgeführt wird (beispielsweise durch einen leeren Array als Indizierung). Der Fall kommt ja durchaus auch mal vor. In diesem Fall würdest du ohne Shift-Register am Ende eine ungültige Referenz schließen wollen, während deine Eingangsreferenz am Ende munter weiter existiert
Sollte man also die Anzahl der Schleifendurchläufe vorher nicht explizit kennen (Verdrahtung durch Konstante etc.) und sollte n=0 möglich sein, wäre bei der For-Loop die Handhabung einer Referenz immer über ein Shift-Register vorzuziehen. Das gilt eigentlich generell mit Daten, die man über die For-Schleife laufen lassen muss.
Noch eine weitere Anmerkung zu deinem Beispiel. Bevor du dir Gedanken über die statische Control-Referenzen deines VIs machst, solltest du vorher die VI-Referenzen im Auge behalten. Du öffnest beispielsweise die VI-Referenz zu deinem test.vi um anschließend an die Control-Referenzen heranzukommen. Soweit so gut, aber an keiner Stelle deines Codes schließt du diese Referenz. Sprich das VI bleibt nach Beendigung munter weiter im Speicher erhalten.

Schöne Grüße
Falk