Frage an C Profis: PUser in callback function

Antworten
Mike D
Beiträge: 528
Registriert: Dienstag 14. Oktober 2008, 14:48
Wohnort: Elbe- Weser-Dreieck

Frage an C Profis: PUser in callback function

Beitrag von Mike D » Dienstag 3. September 2013, 15:59

Moin,
ich muss eine DLL schreiben, die Daten aus Messgeräten empfängt.
Die DLL soll mehrfach in einem Projekt nutzbar sein. Genau hierfür ist ja unter anderem PUser da, weil jeder DLL-Baustein dann seinen eigenes PUser-Array hat hat.
Jetzt muss ich aber den Datenempfang in callback functions machen. Wie übergebe ich den pointer auf PUser und wie kann ich in der callback function auf PUser zugreifen?
aus LabWindows CVI Hilfe
int InstallComCallback (int portNumber, int eventMask, int notifyCount, int eventCharacter, ComCallbackPtr callbackFunction, void *callbackData);
Obiges ist der installer für die callback function, der letzte Parameter könnte den pointer übergeben.
aus LabWindows CVI Hilfe
callbackData void *
A pointer-width value the library passes to the callback function.
You can use callbackData as an integer value or as a pointer to a data object you want to access in the callback function. In this way, you do not have to declare the data object as a global variable.
Ich habe alle Varianten die mir einfallen ausprobiert um einen Pointer auf PUser über callbackData zu übergeben und in der Funktion zu benutzen. Keine führte zum Erfolg.
Gibt es hier einen fähigen C-Fachmann der mir das erklären kann? Leider konnte ich kein Beispiel finden, in dem das wirklich benutzt wurde.

Im Moment behelfe ich mir mit globalen Arrays und jeder Aufruf hat seinen eigenen Index.

Grüße
Mike

abacom
Site Admin
Beiträge: 3917
Registriert: Dienstag 23. September 2008, 10:54
Kontaktdaten:

Re: Frage an C Profis: PUser in callback function

Beitrag von abacom » Dienstag 3. September 2013, 16:31

Da "Callback" und "Calculate" von Natur aus asynchron sind, bleibt wohl nur der eingeschlagene Weg der Zwischenpufferung.
(Um wirklich sicheres Lesen/Schreiben zu gewährleisten müsste man beide Threads evtl. dahingehend sogar noch irgendwie synchronisieren!)
ABACOM support

IKT
Beiträge: 554
Registriert: Mittwoch 4. November 2009, 18:32

Re: Frage an C Profis: PUser in callback function

Beitrag von IKT » Donnerstag 5. September 2013, 09:38

@Mike D,
You can use callbackData as an integer value or as a pointer to a data object ...
Wenn ich obiges richtig verstehe, dann würde ich INTEGER nutzen, der dann jedoch auf die in PUser zur Verfügung gestellten 'doubles' ge-'casted' werden muss. INT direkt geht NICHT!
(Diese Bemerkung ist völlig unabhängig von Abacoms Statement, welches auf keinen Fall ausser acht gelassen werden soll.)
++++++
Gruss/regards IKT

Mike D
Beiträge: 528
Registriert: Dienstag 14. Oktober 2008, 14:48
Wohnort: Elbe- Weser-Dreieck

Re: Frage an C Profis: PUser in callback function

Beitrag von Mike D » Donnerstag 5. September 2013, 10:19

@IKT

Hallo,
ja, ein INT kann ich da übergeben. Mach ich jetzt auch, nämlich den Index für den Zugrif auf die global deklarierten Arrays.
IKT hat geschrieben: der dann jedoch auf die in PUser zur Verfügung gestellten 'doubles' ge-'casted' werden muss
meine Frage ziehlte genau drauf, wie mach ich das?

@abacom

jep, das is mir klar. Die callback-Funktion macht den kompletten Empfang und die Auswertung. "calculate" soll dan nur den Inhalt von PUser in POutput laden.

Grüße
Mike

IKT
Beiträge: 554
Registriert: Mittwoch 4. November 2009, 18:32

Re: Frage an C Profis: PUser in callback function

Beitrag von IKT » Freitag 6. September 2013, 10:24

@Mike D,

an anderer Stelle hier im Forum findest Du meine implementation der HEXtoWORD Beispiel-DLL für DevC++:
http://forum.abacom-online.de/viewtopic.php?f=42&t=3235
In CCalculateEX auf mehreren Positionen sind CAST's auf Char-Pointer (char*) imlementiert. Die waren notwendig um Compilerfehler betreffend 'ungleiche Typen' zu eliminieren. (ACHTUNG: compiliert nur mit DevC++ von Bloodshed, NICHT mit der neueren Ver. von Orwell.)

Code: Alles auswählen

// last try
      sprintf([CAST](char*)[/CAST]PChar(PStrings[HEX_OUT]), "%#04x", int (PInput[WORD_IN]));
      
      // INIT var's
      w=0;
      l=strlen([CAST](char*)[/CAST]PChar(PStrings[HEX_IN]))-1;
Ich bin definitiv KEIN C-Profi. Meine bevorzugte Sprache ist heutzutage FreeBASIC. Die möglichen CAST's da sind vielfältig:
CAST = undefiniert
CDbl = CAST to Double
CSgl = CAST to Single
CLngInt = 64Bit Int (signed)
CUlngInt = 64Bit Int (unsigned)
CInt = 32Bit Int ... etc.
Da ich bei C/C++ nicht weiterhelfen kann, empfehle ich entsprechende Literatur: Handbücher, Referenzen etc. (entsprechend der Sprache/Dialekt des Compilers, der eingesetzt wird).
++++++
Gruss/regards IKT

Antworten

Zurück zu „DLL-Programmierung“