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!
' 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.
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
Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.
Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.
Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
22.02.2010, 17:33 (Dieser Beitrag wurde zuletzt bearbeitet: 22.02.2010 17:34 von IchSelbst.)
' 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 ...
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
Muss man Referenzen schließen?
Hab's getestet. Das macht gar nichts aus.
Gruß Markus
' schrieb:Kannst du mal kucken, was der Errorausgang des Close sagt, wenn du eine VI-Referenz schließt?
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Daher aber mal kurz gesagt: Das Schlimmste was mir passieren kann ist, dass mir der Speicher ausgeht und das VI sich deshalb aufhängt (?).
Zitat:Märchen und Geschichten werden erzählt am Lagerfeuer, technischen Fakten werden mitgeteilt (oder so). (Genauso wie Software nicht auf einem Server "herumliegt", die ist dort installiert.)
' 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.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
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?
Zitat:Märchen und Geschichten werden erzählt am Lagerfeuer, technischen Fakten werden mitgeteilt (oder so). (Genauso wie Software nicht auf einem Server "herumliegt", die ist dort installiert.)
' 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.
Jeder, der zur wahren Erkenntnis hindurchdringen will, muss den Berg Schwierigkeit alleine erklimmen (Helen Keller).
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.
Grüsse
GT123
02.02.2012, 09:27 (Dieser Beitrag wurde zuletzt bearbeitet: 02.02.2012 09:29 von Falk.)
(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.