INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Buffer reservieren + Pointer auslesen



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!

05.09.2008, 19:07
Beitrag #11

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Buffer reservieren + Pointer auslesen
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

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!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
05.09.2008, 23:31
Beitrag #12

Peter Knauer
Unregistered


 







Buffer reservieren + Pointer auslesen
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.
Diese Nachricht in einer Antwort zitieren to top
09.09.2008, 10:50 (Dieser Beitrag wurde zuletzt bearbeitet: 10.09.2008 22:12 von jg.)
Beitrag #13

Peter Knauer
Unregistered


 







Buffer reservieren + Pointer auslesen
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.
Lv86_img


Angehängte Datei(en)
Sonstige .zip  AVI.zip (Größe: 1,28 MB / Downloads: 214)
Diese Nachricht in einer Antwort zitieren to top
09.09.2008, 10:55
Beitrag #14

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Buffer reservieren + Pointer auslesen
' schrieb:VI posten wäre nicht schlecht.

Aber mal so aus dem Bauch raus:

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.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
09.09.2008, 11:04
Beitrag #15

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Buffer reservieren + Pointer auslesen
' 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.

Rolf Kalbermatter

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  Datenübergabe an DLL Pointer to Pointer Reiling 2 9.566 02.02.2018 10:59
Letzter Beitrag: Reiling
  Absturz durch unzulässige Pointer VS_03 3 10.274 28.10.2016 18:32
Letzter Beitrag: VS_03
  dll mit Pointer auf komplexe Struktur einbinden Wedgewood 11 16.988 27.04.2014 23:44
Letzter Beitrag: Wedgewood
  Pointer auf Array mit Labview übertragen und darstellen lupus022 35 32.400 19.07.2013 10:53
Letzter Beitrag: lupus022
  Pointer und MoveBlock OXO 4 8.191 03.06.2013 16:31
Letzter Beitrag: OXO
  Pointer auf Subarray übergeben Event Horizon 5 7.382 15.07.2012 10:21
Letzter Beitrag: rolfk

Gehe zu: