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!
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
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!
' 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.
09.09.2008, 10:50 (Dieser Beitrag wurde zuletzt bearbeitet: 10.09.2008 22:12 von jg.)
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.
Wenn dll Buffer alloziert, ist das sicherlich nicht schlecht. Dann gibt es keinen Ärger mit dem LV-Speichermanager.
Ich würde dann "char** ppcImgMem" entweder als U32 oder als Pointer zu U32 definieren. Damit bekommst du die Anfangs-Adresse des Buffers zurück. Dieses Wert übergibst du dann einfach als Wert an die AddToSequence-Funktion. Soll heißen, bei dieser Funktion definierst du das nicht als char*, sondern als U32.
Gruß, Jens
P.S.: IDS liefert doch eine Highlevel-LV-Schnittstelle zu µEye-Kameras. Funzt die nicht?
"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.
' 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.
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.
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.