Callback, ohne Win-Api
-
Ich sitze mal wieder an meine Linux-> windows Problem.
Hier mal kurz der Code den ich geschrieben habe.
im cb.h
typedef void(*calling)(int x, int *ptr); void Caller(int x,calling cb, int *ptr);in cb.c
#include "cb.h" void Caller(int x, calling cb, int *prt){ cb(x, prt); }und in main.c eine Thread-Funktion mit:
DWORD WINAPI ThreadFunc(LPVOID data) { for (int index=0; index<5000; index++) { int z=60000; printf("Thread Nr.:%d ist bei Index Nr.:%i\r\n",(int)data+1,index); // Wert ausgeben if (index==2500) Caller(z, calling cb, &index); Sleep(50); ; // Verzöger ein bisschen das ganze } // end for index // gibt den Wert zurück den du bekommen hast return((DWORD)data); } // end ThreadFunc void calling(int x, int *ptr){ printf ("hier ist der Callback \n"); *ptr=x; }Leider weigert der Compiler das zu kompilieren.
Was habe ich falsch gemacht?
Ich möchte einen Pointer auf ein Funktion übergeben.
Das brauch ich für die kompatiblität der DLL. Später solll der Pointer in eine verkette Liste, und nach Bedarf aus einem Thread aufgerufen werden.
Das Ganze ist natürlich nur ein test-Programm, damit ich wenigstens die richtige Form habe, bevor ich das Ganze in die Echte DLL übernehme.
-
typedef void(*fnCall)(int x, int* pInt); void Caller(fnCall callfunc, int x, int* pInt) { callfunc(x, pInt); }void CallFunction(int x, int* pInt) { std::cout << "CallFunction aufgerufen!" << std::endl; *ptr=x; } UINT_PTR WINAPI ThreadFunc(LPVOID data) { for (unsigned int i = 0; i < 5000; ++i) { std::cout << "Thread Nr.: " << data + 1 << " ist bei Index Nr.: << i << std::endl; if (i == 2500) Caller(CallFunction, 600, &i); Sleep(50); } return 0; }
-
supi, ich weiß zwar nicht genau, warum, die verbesserungen bei Meinem Code nicht funktioniert haben, aber nach dem ich die unsigned int i in int i
und *prt in *pInt verändert habe, funktionierte dein Code. Nur leider beendet der dann den Thread, und springt nicht wieder zurück. Also printet bis 2500, schreibt dann callback-Funktion ist erreicht, und kommt nicht zurück in den Thread.
Ich muss doch bestimmt noch einen Rücksprung ala void *arg mit in die CallFunktion mit übergeben oder ? wie macht man das ? hast du da auch Ahnung?Auf jedenfall schonmal Danke!
-
Hmm naja kann sein das den der Name deiner alten Funktion void calling(int x, int *ptr) irritiert hat, weil du das calling ja als nen typen definiert hattest ... hmm naja auch egal ... ne normal sollte der wieder zurück springen... naja und du hast ne Endlosschleife drin .... weil du i halt auf 600 setzt und der dann wieder bis 2500 hochzählt und dann wieder auf 600 gesetzt wird usw...
-
Oh ich bin ja auch dumm, ich habe im callback i auf 60000 gesetzt, springe aber aus der schleife ab 5000...

Ich papnase.