Memberfunktion als Thread?



  • Hallo,

    ich will eine Memberfunktion meiner Klasse als Threadfunktion verwenden.
    Den Thread will ich mit beginthreadex starten, das sieht etwa so aus:

    _beginthreadex(0,0,Memberfunktion,0,0,&thread_Id);
    

    Nur jetzt braucht man als dritte Argument ein

    unsigned (__stdcall *__start)(void *)
    

    😕 auf die entsprechende Memberfunktion. Besonders da Memberfunktionen (bzw. deren Zeiger) ja eh noch so ne Sache für sich sind, bin ich jetzt leider total überfordert.

    Wäre nett wenn mir jemand den richtigen Weg weisen kann, damit diese Thread funktioniert.



  • Noch zur Ergänzung, ich starte den Thread aus der Klasse raus (also einer anderen Memberfunktion)



  • Die Member-Funktion muss static sein.



  • Wenn möglich einfach die Funktion static machen 🕶



  • hmm, jetzt kommt die Fehlermeldung:
    Konvertierung von 'void (*)(void *)' nach 'unsigned int (__stdcall *)(void *)' nicht möglich
    😞
    davor waren es aber mehr Fehler



  • Die Calling-Convention deiner Thread-Funktion stimmt auch nicht, es muss __stdcall sein. In der Deklaration nach dem Return-Typ einfach CALLBACK einfügen.



  • Danke für die Hilfe,
    ich hab es jetzt mit CreateThread gemacht:

    CreateThread(0,0,(LPTHREAD_START_ROUTINE) Elementfunktion,0,0,(LPDWORD)&thread_Id);
    

    das funktioniert eigentlich.

    Nur da es jetzt statisch ist, kann ich dort dummerweise keine nichtstatischen Elementvariablen mehr verwenden.
    Ich werd die jetzt irgendwie als Referenz (im struct) oder so übergeben müssen.. oder gibts da noch eine andere Lösung?



  • CreateThread(0,0,Elementfunktion,this,0,&thread_Id);
    

    dann castest du in der Thread-Funktion den void* Parameter wieder in einen this-Zeiger.



  • das hört sich sehr gut an, aber ich hab wohl nicht so die Ahnung was das casten von this angeht. Egals was ich mache, es steht dort immer:
    'this' kann nur für Elementfunktionen verwendet werden
    😞
    Vieleicht könntet ihr mir den kleinen "cast code" gerade zeigen?



  • static DWORD CALLBACK MyThread(LPVOID pParam)
    {
    	MyClass* p = static_cast<MyClass*>(pParam);
    	//...
    }
    

    oder du könntest Folgendes machen:

    template<class T>
    HANDLE CreateThreadT(DWORD (CALLBACK *pfn) (T*), T* p, LPDWORD lpThreadId)
    {
    	return ::CreateThread(0,0,reinterpret_cast<LPTHREAD_START_ROUTINE>(pfn),p,0,lpThreadId);
    }
    
    //...
    
    CreateThreadT(MyThread,this,&dwThreadId);
    

    und die Deklaration deiner Thread-Methode würde dann so aussehen:

    static DWORD CALLBACK MyThread(MyClass* p);
    


  • super, danke! Jetzt lüft alles schön 👍


Anmelden zum Antworten