[GELÖST] Thread Wrapper Template
-
Hallo zusammen,
ich bin leicht am verzweifeln
Ich möchte per
CreateThread
eine Objekt-Methode aufrufen. Dafür wollte ich einen denkbar einfachen wrapper schreiben. Am entscheidenden Aufruf bekomme ich jedoch eine Access Violation.
Folgendes funktioniert:// Server.cpp /* ... */ DWORD ( Server::* method)(void) = &Server::wait_for_clients; Server* THIS = this; (THIS->*method)(); /* ... */ DWORD wait_for_clients(){ /* ... */ }
Dies wollte ich Analog auf mein template übertragen:
// Server.cpp /* ... */ Thread_Wrapper<Server> wrap(this, &Server::wait_for_clients); CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Thread_Wrapper<Server>::start, (LPVOID)&wrap, 0, NULL); /* ... */
// Thread_Wrapper.h #include <WinDef.h> template<class T> class Thread_Wrapper { public: T* object; DWORD ( T::* method)(void); public: static DWORD start(LPVOID thread_wrapper_obj) { Thread_Wrapper<T>* wrap = (Thread_Wrapper<T>*)thread_wrapper_obj; T* object = wrap->object; DWORD ( T::* method)(void) = wrap->method; (object->*method) (); return 0; } Thread_Wrapper(T* object, DWORD ( T::* method)(void)) { this->object = object; this->method = method; } ~Thread_Wrapper(void){} };
(object->*method) ();
wirft mir jedoch die Access Violation. Ich weiß nicht warum. Es muss eine Kleinigkeit sein, die ich übersehe, da der Aufruf ohne Wrapper funktioniert.
Vielen Dank schon mal für die Hilfe
Nico
-
Ok, Problem erkannt, Gefahr gebannt
Dadurch, dass ichwrap
auf dem Stack angelegt habeThread_Wrapper<Server> wrap(this, &Server::wait_for_clients);
wurde das Objekt fast direkt nach dem Aufruf von
CreateThread
zerstört, womit auch alle Zeiger ungültig wurden -.-
Wenn ich es auf dem heap anlege oder ihm einen globalen scope gebe, funktionierts wunderbar... Ich hatte doch gehant, dass es eine Kleinigkeit ist
Grüße an alle