' schrieb:Ja, was sie liefern sind sehr simple VIs, in denen diese dll-Aufrufe drinstehen. Diese mitgelieferten VIs und auch die Beispielprogramme enden leider genau da, wo es interessant wird:
Die wissen wahrscheinlich warum ... weil es möglicherweise nicht wirklich gut funktionieren wird.
Ich muss ein wenig spekulieren, weil ich diese Schnittstelle nicht genau kenne. Dass das so gar nicht oder nicht so einfach geht, finde ich aber nicht sehr überraschend.
Du übergibst in deiner Schleife bei der zweiten Iteration genau den gleichen Speicher wie beim ersten mal. Um das zu vermeiden ruft das IDS in dem Beispiel mit dem Ringpuffer vermutlich das VI zum Speicherallokieren auch drei mal separat auf, anstatt es in einer Schleife zu machen. Setze doch mal zwischen "Array initialisieren" und "is_SetAllocatedImageMem()" die Funktion "Immer kopieren" (in der Palette Applikationssteuerung, Speicherverwendung). Wenn das nicht funktioniert (was ich mir gut vorstellen kann), dann setze "Array initialisieren" außerhalb der Schleife und mache ein zweidimensionales Array daraus.
Das nächste Problem wird sein, dass die DLL auch nach dem Ende von "is_SetImageMem()" noch auf die Speicherbereiche zugreift. Für LabVIEW wird ein Speicherbereich nicht mehr benötigt, wenn die Leitung endet. Das ist nach "is_SetImageMem()" der Fall. Die Daten werden also (für LabVIEW) nirgendwo mehr gebraucht und können daher auch freigegeben werden. Möglicherweise passiert nur deshalb kein Crash, weil LabVIEW den Speicher nicht frei gibt und ihn stattdessen für evtl. auftretende erneute Aufrufe des VIs reserviert hält. Du müsstest dafür sorgen, dass der Speicher der einzelnen Frames nicht freigegeben und von LabVIEW auch nicht anderweitig verwendet wird. Es könnte leichte Probleme bereiten, LabVIEW hier auszutricksen.
Unter Umständen musst du dich mit Funktion wie GlobalAlloc(), GlobalFree(). des Betriebssystems befassen. Dann hast du das Belegen und Freigeben des Speichers selbst in der Hand. Beispiele für die Anwendung dieser Funktionen müssten sich z.B. in VIs finden, die Daten zwischen dem Clipboard und LabVIEW austauschen.