Hallo GerdW,
vielen Dank erstmal für deine Antworten und dass du dir so viel Zeit dafür nimmst!
Zitat:Warum nicht? Jede Referenz sollte geschlossen werden - vor allem, wenn damit relativ viel Speicher belegt wird!
Genau das ist hier das Problem: IMAQ-Images sind eben nicht direkt Bilddaten, sondern nur Referenzen auf die Bilddaten. Und diese Referenzen werden von dir nicht geschlossen, sondern einfach mit neuen leeren Referenzen überschrieben!
Also: deinen Speicher freigeben, indem jede Referenz im Array mit IMAQClose freigegeben wird!
Die IMAQClose Funktion schließt aber nur Sessions, und keine IMAQ Bilder, bzw. der Input einer solchen Close Funktion ist immer eine Session. Die schließe ich am Ende der Aufnahme auch wieder, trotzdem bleibt der Speicher belegt.
Zitat:Weitere Fehler:
- Warum nutzt du nicht AutoCleanup? Dein BD würde mindestens um den Faktor 2 kleiner!
Hatte ich vergessen, sorry. Ich nutze das Auto Cleanup in meinem großen VI nicht mehr, da mir das Ergebnis zu unübersichtlich ist.
Zitat: - Deine WhileLoop läuft 1001× durch, obwohl dein Array nur 1000 Referenzen enthalten soll (Test auf "i>=1000"!)…
Ist mir auch aufgefallen, habe ich entsprechend korrigiert
Zitat: - Warum initialisierst du dein Array mit 1000 leeren Referenzen, wenn diese in der Schleife danach von neuen Referenzen überschrieben werden?
Ich wusste ehrlich gesagt gar nicht, dass dabei nur Referenzen erstellt werden, dann nehm ich das mal aus meiner Initialize Funktion raus..
Zitat: - Warum keine FOR-Loop statt der While-Loop, wenn die maximale Iterationszahl schon vorher feststeht?
Stimmt, in diesem Beispiel wäre das besser gewesen, in meinem Haupt VI brauche ich eine While Loop, da dort das Ende idR unbestimmt ist.
Zitat: - Warum ein Schieberegister für dein Array? Warum nicht einen autoindizierenden Ausgangstunnel für die Array-Daten? Wenn dann am Ende keine 1000 Werte zusammenkommen, weil die Loop vorher abgebrochen wird, kannst du immer noch entsprechend viele leere Referenzen ans Array anhängen!
Ich habe in einem anderen Forum gelesen, dass es besser ist, ein Array vorher zu initialisieren und dann die replace Funktion zu benutzen, da es weniger Ressourcen benötigt. Ist dem nicht so?
Zitat: - Du hast eine RaceCondition beim Lesen der "Session Out" per PropertyNode! Warum überhaupt dieser Zugriff per Propertynode, wenn der Wert in SessionOut im VI selbst erstellt wird? "The wire keeps the value!"
Hier im Beispiel wäre es tatsächlich unnötig, in meiner State Machine wird die Kamera aber an anderer Stelle initialisiert und ich greife dann per Referenz auf die Session zu, da ich keine lokalen Variablen verwenden möchte.
Mir ist auch aufgefallen, dass der Arbeitsspeicher beim erneuten ausführen nicht noch größer wird, sofern man weniger Bilder als vorher erstellt. Daher scheint der Platz nicht wirklich belegt zu sein, sondern nur ,,reserviert'', oder was denkst du?
Danke und beste Grüße,
moTo