Thread-Callbackfuntion in Klasse einpflegen?
-
Hallo,
ich hatte heute versucht, CreateThread einen Zeiger auf meine Klassenmethode zu übergeben. Nach kurzer Recherche fand ich heraus, dass CreateThread nicht mit Klassenmethoden zusammenarbeitet. Nun dachte ich mir, dass ich meine Callbackfunktion einfach global ausserhalb der Klasse definiere, was auch prinzipiell ganz gut klappte. Das Problem an der Sache ist nur, dass innerhalb dieser Funktion mit verschiedenen Klasseneigenschaften gearbeitet wird. Ich brauche also zwingend eine Klasseninstanz.
Zuerst dachte ich mir, dass ich meiner Klasse eine Methode MeineKlasse GetInstance()* definiere, die die Instanz (this) zurückgibt. In der Callbackfunktion wollte ich sie folgendermaßen anwenden:
DWORD WINAPI ThreadProc(void *lpParam) { MeineKlasse inst = *MeineKlasse::GetInstance(); }Allerdings brachte mir der Compiler dann die Fehlermeldung, dass diese GetInstance Methode nicht statisch ist... Und wenn sie statisch deklariert wurde (static), dann kam die selbe Fehlermeldung.
Meine Frage dazu ist: Kann ich irgendwie alternativ an die Klasseninstanz kommen, oder geht das nicht? Und wenn das der Fall ist, wie bekomme ich dann diese Callbackfunktion zum Laufen? Danke!
-
rate mal wofür lpParam da ist
-
1. Du definierst ThreadProc als statische Methode in Deiner Klasse:
static DWORD WINAPI ThreadProc(void *lpParam);2. Du übergibst CreateThread in lpParameter einen Zeiger auf Deine Klasse.
3. ThreadProc sieht dann so aus:
DWORD WINAPI MeineKlasse::ThreadProc(void *lpParam) { MeineKlasse* inst = (MeineKlasse*) lpParam; }
-
Hey danke, so funktioniert es. Mit dem lpParam hätte ich wohl auch draufkommen können, aber das mit dem static war mir neu
...
-
Hmm und um dir dann viel Schreibarbeit zu sparen, machst du es noch anders:
class thread { public: virtual void create(); // hier rufst du dann CreateThread/beginthread(ex) auf (mit this als Zeiger). protected: virtual DWORD WINAPI thread_proc() { return 0; } private: static DWORD WINAPI __thread_proc(LPVOID lpInstance); { thread* ptr_instance(static_cast<thread*>(lpInstance)); return ptr_instance->thread_proc(); } };thread_proc überlädst du einfach ...
ehm wobei man dann am einfachsten sich noch was mit templates bastelt, so das man auch dem Thread noch andere Parameter mitgeben kann ... (struct param { _Type1& type1; _Type2& type2; thread* ptr_thread; } usw. ...)
-
Okay danke, ist 'ne gute Idee.