' schrieb:Hallo Rolf,
du glaubst ja gar nicht, wie sehr du mir geholfen hast :Dunglaublich - es funktioniert fast. d.h. ich mach das jetzt genau so wie besprochen.
ein problem habe ich aber noch - der event wird in der richtigen frequenz ausgelöst und daten werden übertragen, aber anscheinend wird der Buffer nicht korrekt aktualisiert, d.h. die der string ändert sich nicht. zuerst hatte ich die befürchtung, dass das memcpy bei abgebrochen wird (da die daten ca. so aussehen 01 41 00 00 09 01..). aber die funktion kopiert ja wirklich alles zum LVbuffer.
die buffer die ich verwende sind ja auch globale variablen in meine dll, deshalb habe ich mir gedacht, dass das schon so passt, oder muss ich von LabVIEW aus einen cstring zeiger mit der gewünschten adresse an meine dll übergeben und dort die daten hineinschreiben?
Danke für die Hilfe
Also ich habe bis jetzt noch nicht String oder Array Handles als Datenelemente in UserEvents von meinem C Code gebraucht. Grundsätzlich sind da aber zwei Möglichkeiten:
Entweder erwartet die LVPostUserEvent() Funktion dass sie Handles erben kann oder nicht.
Ich tendiere dazu anzumehmen dass sie das eben schon will, da dass mit dem allgemeinen Speicherkonzept von LabVIEW einhergeht.
Das heisst LVPostUserEvent nimmt ganz einfach an, dass ein Handle in den userEvent Daten nicht kopiert werden muss sondern einfach geerbt werden kann. Das ist auch speicherplatzmässig und in runtime performance effizienter.
Das heisst für Dich Du musst vor jedem PostUserEvent einen LStrHandle anlegen, die gewünschten Daten hineinekopieren und als Parameter an die Funktion mitgeben. Wenn Du beim Konzept der StringHandles bleiben willst wäre eventuel die Funktion LStrPrintf() für Dich interessant. Du musst ihr zwar ein gültiges LStrHandle übergeben (DSNewHClr(4) ist dafür aber genug) aber das formatieren des Strings und anschliessendes korrektes Resizen des Handle's sowie einfüllen der richtigen Anzahl Characterelemente macht alles die LStrPrintf() Funktion für Dich.
Sobald die LVPostUserEvent() Funktion zurückkehrt musst Du dieses Handle als von LabVIEW konsumiert betrachten und ist es in Deiner Funktion halt nicht mehr benützbar. Keine globalen LStrHandle also!
Wenn ich falsch habe, solltest Du den Speicher langsam umhoch gehen sehen da bei jedem Aufruf ein Speicherhandle verloren geht aber ich glaube es eher nicht.
Rolf Kalbermatter