[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 ich wrap auf dem Stack angelegt habe

    Thread_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


Anmelden zum Antworten