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!
Hallo,
wenn ich von LV in einer DLL Speicher dynamisch reservieren lasse, aus diesem etwas lese, und diesen danach mit einer Funktion der DLL wieder freigebe, verschwinden die angezeigten Daten (logisch), aber Labview stürzt sofort darauf ab. Wieso?
Konkret habe ich eine Funktion, die mir ein Array dynamisch erzeugt, und in dieses Werte hineinschreibt. Diese lese ich mit Labview aus, und will nach dem Auslesen bei Beendigung des VI den Speicher wieder freigeben. Das Array zeigt darauf nichts mehr an, und das VI stürzt ab.
Wie kann ich dann das Array freigeben, um kein Speicherleck zu erhalten?
Vielen Dank!
Deine Beschreibung ist recht dünn.
Wie schon im letzten Thread, ein Upload eine VIs + DLL wäre nicht schlecht.
Ein weiterer Ansatz: Verwende anstatt der XNodes einmal den direkten DLL-Aufruf "MoveBlock". Da bin ich mir sicher, dass die Daten wirklich kopiert werden, IMHO solltest du dann auf gar keinen Fall ein Speicher-Problem haben.
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!
Ich habs lösen können, das Problem war offensichtlich, dass ich die externe Funktion zur Speicherfreigabe ohne Wartezeit aufgerufen habe, aber Labview anscheinend noch mit der Abarbeitung einiger anderer Programmteile nicht fertig war, die auf den nun nicht mehr existenten Speicher zugreifen wollten. Mit Wartezeit funktionierts nun.
23.07.2013, 07:34 (Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2013 07:34 von GerdW.)
Wie führt denn LV eigentlich das Programm aus? Parallel, oder sequentiell von links nach rechts? Sofern parallel, kann es ja durchaus passieren, dass ein Teil des Codes den Speicher bereits löscht, während ein anderer noch daraus zugreift, oder?
Aber ich hänge einfach mal das VI, das ich habe, als Anhang an, sofern noch mehr dieser Fehler auftreten.
Vielen Dank!
Zitat:Wie führt denn LV eigentlich das Programm aus? Parallel, oder sequentiell von links nach rechts?
Schon mal den Begriff DATAFLOW gehört?
- Ein Programmteil wird ausgeführt, wenn alle nötigen Daten bereitstehen.
- Daten werden per Draht transportiert.
- Wenn zwischen Programmteilen keine Datenabhängigkeit besteht, werden sie (quasi) parallel abgearbeitet.
- Likns/Rechts und Oben/Unten sind relativ. Man kann einen Monitor auch drehen
Autsch, das kann immer noch schief gehen, trotz Wait Funktion.
Du kannst überhaupt nicht vorhersagen, wann der "CleanUp" Aufruf ausgeführt wird. Der hängt einfach parallel zum Rest vom Code drinnen.
Die genaueren Hintergründe hat Gerd schon geschildert.
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!
Aber das würde doch meine These stützen: Wenn ein Teil des Programmes noch auf Daten zugreift, die ein anderes Programm ohne Wartezeit sofort löscht, gibt es einen Crash. Und damit ist doch eine gewisse Wartezeit nötig, oder?
23.07.2013, 09:34 (Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2013 09:38 von GerdW.)
Zitat:Wenn ein Teil des Programmes noch auf Daten zugreift, die ein anderes Programm ohne Wartezeit sofort löscht, gibt es einen Crash
Symptombeobachtung: Korrekt.
Zitat:Und damit ist doch eine gewisse Wartezeit nötig, oder?
Analyse: Falsch.
Was du brauchst, ist DATAFLOW. Du musst eine explizite Abhängigkeit der Programmteile schaffen. Gern genutzt wird dafür ein ErrorCluster-Draht...
P.S.:
- Schön sind immer wieder Case-Strukturen, die vom Compiler wegoptimiert werden können. (TRUE-Konstante am Selektor)
- Schön auch die nicht-DATAFLOW-konforme "Wartezeit", die an dieser Stelle überhaupt nichts bringt, da sie parallel abgearbeitet wird...
THINK DATAFLOW!