[GELÖST] Thread Wrapper Template
-
Hallo zusammen,
ich bin leicht am verzweifeln
Ich möchte perCreateThreadeine 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 ichwrapauf dem Stack angelegt habeThread_Wrapper<Server> wrap(this, &Server::wait_for_clients);wurde das Objekt fast direkt nach dem Aufruf von
CreateThreadzerstö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