Buffer reservieren + Pointer auslesen - Druckversion +- LabVIEWForum.de (https://www.labviewforum.de) +-- Forum: LabVIEW (/Forum-LabVIEW) +--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein) +---- Forum: DLL & externer Code (/Forum-DLL-externer-Code) +---- Thema: Buffer reservieren + Pointer auslesen (/Thread-Buffer-reservieren-Pointer-auslesen) Seiten: 1 2 |
Buffer reservieren + Pointer auslesen - jg - 05.09.2008 19:07 Hallo, Peter, jetzt kann ich ein wenig genauer weiterhelfen, nachdem ich auch hier auf dem Rechner IDS-Treiber und Bsps. installiert habe. Das Problem zur Speicherallozierung in LV hat Martin ausführlich genug geschildert. Da brauch ich nichts mehr hinzuzufügen. Ich hänge jetzt nur mal die Erklärung dran, warum im Bsp. von IDS (ich gehe vom Bsp. uEye_LiveStream_32bit_Sequence.vi aus) das VI AllocateAndAddToSequence.vi 3x hintereinander als quasi "Sequenz" drin steht: Dieses VI ist als reeantrant definiert. Somit bekommt jede Instanz des VIs während der Ausführung seinen eigenen Speicherbereich zugewiesen (und zwar jede Instanz, die im BD drin steht, deswegen funzt sowas nicht in einer Schleife). Solange das VI läuft, das diese 3 Instanzen aufgerufen hat, wird auch nicht der Speicher gelöscht oder wiederverwendet, der durch diese VIs belegt wurde. Deswegen funktioniert das jetzt mit den 3 Buffern, die in LV angelegt sind. Gruß, Jens Buffer reservieren + Pointer auslesen - Peter Knauer - 05.09.2008 23:31 Hallo! Vielen Dank schonmal für die Mühe! ' schrieb:Dieses VI ist als reeantrant definiert. Somit bekommt jede Instanz des VIs während der Ausführung seinen eigenen Speicherbereich zugewiesen (und zwar jede Instanz, die im BD drin steht, deswegen funzt sowas nicht in einer Schleife). Solange das VI läuft, das diese 3 Instanzen aufgerufen hat, wird auch nicht der Speicher gelöscht oder wiederverwendet, der durch diese VIs belegt wurde. Deswegen funktioniert das jetzt mit den 3 Buffern, die in LV angelegt sind.Das verstehe ich vage, sag ich mal. Werde mich da nochmal schlauer lesen, vielen Dank! Wie könnte man denn das Problem sonst umgehen (abgesehen von meiner hoffentlich funktionierenden Lösung der dll-internen Allokation)? Ich brauche etwa 5400 allokierte Frames (90 fps * 60 Sekunden). Das geht einfach nicht anders als in einer Schleife. Buffer reservieren + Pointer auslesen - Peter Knauer - 09.09.2008 10:50 Also, wie versprochen hier die Lösung. Nachdem ich meinen Ringpuffer selbst erfolgreich erstellt hatte, kam auch von IDS eine Lösung, und zwar anhängende. Jetzt muss ich einmal herausfinden, wie man ein Event, das eine dll abfeuert, in LabVIEW auswertet... Wer mir da helfen kann, gerne, ich werde erstmal selber lesen und dann ggf. einen neuen Thread dazu starten. Buffer reservieren + Pointer auslesen - rolfk - 09.09.2008 10:55 ' schrieb:VI posten wäre nicht schlecht. "char **name" ist leider ein Pointer auf einen Pointer auf einen Speicherbereich. Also doppelt referenziert und das unterstützt LabVIEW nicht direkt. In diesem Falle geht es aber wenn man nur am eigentlichen Pointer selber interessiert ist indem man den Parameter als U32 und Pointer To Value konfiguriert. überall wo dieser Pointer dann übergeben werden muss konfiguriert man ihn ebenfalls als U32 und wenn es "nur" als "char *name" deklariert ist, lässt man den Wert als Passed by Value stehen. Nicht vergessen die zugehörige Speicherfreigabe am Ende des Programmes für jeden allozierten Pointer aufzurufen, sonst geht es sehr sehr schnell ins Out Of Memory Nirvana in der LabVIEW Applikation. Rolf Kalbermatter Buffer reservieren + Pointer auslesen - rolfk - 09.09.2008 11:04 ' schrieb:Also, wie versprochen hier die Lösung. Nachdem ich meinen Ringpuffer selbst erfolgreich erstellt hatte, kam auch von IDS eine Lösung, und zwar anhängende. Such Dich mal zu der LabVIEW Funktion PostLVUserEvent schlau. Bin nicht sicher obs da hier auch schon etwas gibt aber ganz sicher auf LAVA und auf dem NI Forum. Das ist seit LabVIEW 7.1 die bevorzugte Art um Events von einer DLL nach LabVIEW zu machen. Rolf Kalbermatter |