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!
Aus "optischen" Gründen bin ich dazu übergegangen, nicht mehr alle Melder und Queues durch das Programm zu verbinden, da ich sonst Unmengen an Linien hab.
Meine Frage - wenn ich jetzt jedesmal innerhalb einer while-Schleife einen Melder so wie auf dem Bild aufrufe mit "Melder anfordern..." - wird dann bei jedem Aufruf eine Referenz erstellt und im Laufe der Zeit der Speicher mit Referenzen "zugemüllt"?
Anzeige
10.04.2013, 07:35 (Dieser Beitrag wurde zuletzt bearbeitet: 10.04.2013 07:43 von Lucki.)
Natürlich nicht, denn wenn es unterschiedliche Referenzen wären, dann gäbe es doch keinen Datenaustausch zwischen Sendern und Empfängern. Die Idee der "optischen Vereinfachung" läßt sich übrigens noch weiter treiben. Ich schließe als Referenz überall nur ein winzig kleines Dings an, also so:
Hinter diesen kleinen Ding steckt ein SubVI (FGV). Es dient, wie man sieht, zum Lesen der Referenz. Beim ersten Aufruf wird die Referenz außerdem erzeugt:
Ich habe ohne irgendwelches Hintergrundwissen nur rein logisch argumentiert. Komisch ist das aber doch, aber es ist ja kein Problem die sich widersprechenden Aussagen über das Experiment entscheiden zu lassen.
Wenn ich also 1E5 Queues erstelle, und zwar so:
Dann sehe ich im "Windows Task Manager/Performance" das dafür mehr als 100 MByte Memory verwendet werden.
Darum geht es hier aber nicht. Es geht darum, dass man die Funktion "Melder anfordern" auf einen Melder anwendet, der bereits existiert und einen Namen hat, also so:
Und hier sieht man ebenso deutlich, dass auch bei noch so vieler (auch millionenfacher) "Erzeugung" (- Die ja gar keine ist -) kein Memory verbraucht wird.
So unvorstellbar dumm kann Labview doch überhaut nicht sein: Dass es intern Millionen verschiedener Melder-Referenzen erzeugen kann, die sich aber alle auf ein und denselben Melder beziehen. Das ist aber, wenn ich Dich recht verstehe, der Kernpunkt Deiner Aussage.
10.04.2013, 12:36 (Dieser Beitrag wurde zuletzt bearbeitet: 10.04.2013 12:38 von Hasenfuss.)
(08.04.2013 20:24 )jg schrieb: Du hast 2 "unabhängige" Referenzen auf denselben Melder erzeugt.
Grundregel: Pro Obtain braucht es üblicherweise ein Close/Destroy.
Ausnahme: Du erzwingst durch ein TRUE die Zerstörung aller Referenzen.
Gruß, Jens
Da steht, dass ich zwei unabhängige Referenzen auf einen Melder erzeugt habe - und wenn ich doch zwei unabhängige Referenzen erzeuge, dann brauchen die doch auch Speicherplatz - oder nicht? Sonst hätt ich dort doch nicht das Problem gehabt, dass ich TRUE zur Zerstörung aller Referenzen bei Melder freigeben angeben müsste.
Zitat:So wie du (Hasenfuss) es gemacht hast, wird dir der Speicher zugemüllt! Intern wird zwar am Ende auf dieselbe Queue bzw. Notifier verwiesen, trotzdem
Zitat:"Und hier sieht man ebenso deutlich, dass auch bei noch so vieler (auch millionenfacher) "Erzeugung" (- Die ja gar keine ist -) kein Memory verbraucht wird.
Ich bin jetzt leider noch nicht wirklich schlauer - bis auf die Tatsache, dass meine Methode ungeschickt ist und FGVs zum Speichern der Referenzadresse eine bessere Variante ist.
Dein Bsp greift außerdem zu kurz. Du übersiehst, dass der LabVIEW-Compiler inzwischen sehr schlau geworden ist.
Da die Refnum-Out von Obtain Notifer bei deinem Bsp. überhaupt nicht weiter verwendet wird, wird wahrscheinlich die komplette For-Schleife wegoptimiert.
Gegenbsp:
Alle Refnums sind anders!
@Hasenfuss:
Das ist kein einfaches Thema: Natürlich wird innerhalb einer Programm-Instanz auf denselben Notifier verwiesen, wenn sie den gleichen Namen haben. Trotzdem kann es sein, dass verschiedene "Obtain Notifer" eine andere Refnum erzeugt (vgl. Hilfe, s. oben). Und deshalb wird auch dringend empfohlen, für jedes Instanz von "Obtain" ein Close/Destroy zu verwenden.
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
(10.04.2013 10:36 )Lucki schrieb: So unvorstellbar dumm kann Labview doch überhaut nicht sein: Dass es intern Millionen verschiedener Melder-Referenzen erzeugen kann, die sich aber alle auf ein und denselben Melder beziehen.
Doch genau das tut LabVIEW! Jedes Obtain eine Referenz. Also viele Referenzen auf einen gemeinsamen Melder, der erst "verschwindet", wenn die alle Referenzen darauf verweisenden Referenzen geschlossen sind.
So ist's dokumentiert und lässt sich einfach testen.
Gut, ihr habt Recht. Da ich bei Melden/Queues aber immer mit überschaubar vielen Quellen und Senken zu tun haben werde, und nicht mit Millionen, ordne ich den Sachverhalt ein in die Kategorie "unnützes Wissen" - soweit es das Programmieren betrifft. Wenn es allerdings darum geht mal zu zeigen, wer der oberste Guru ist: Dafür ist das Wissen Spitze. (Könnt ihr jetzt meinem hintergründigem Humor noch folgen oder muss ich ein passendes Emotikon suchen?)
(10.04.2013 13:26 )Lucki schrieb: Gut, ihr habt Recht. Da ich bei Melden/Queues aber immer mit überschaubar vielen Quellen und Senken zu tun haben werde, und nicht mit Millionen, ordne ich den Sachverhalt ein in die Kategorie "unnützes Wissen" - soweit es das Programmieren betrifft. Wenn es allerdings darum geht mal zu zeigen, wer der oberste Guru ist: Dafür ist das Wissen Spitze. (Könnt ihr jetzt meinem hintergründigem Humor noch folgen oder muss ich ein passendes Emotikon suchen?)
Ich denke ich verstehe den Humor anders wie du Ihn wohl meinst Sonst ist der Punkt schon sehr wichtig weil gerade die Nichtbeachtung von "Jeder Obtain ein Close", gerade für Neulinge, langfristig zu Problemen führt.