member funktion eines heap objekts an CreateThread übergeben



  • Hallo,

    wie kann ich eine member function eines auf dem heap alloziierten objekts an einen thread (windows.h) übergeben?

    Unteres Beispiel sagt mir
    A::threadFunctino: function call missing argument list; use '&A::threadFunction' to create a pointer to member

    Aber ich brauche ein auf dem heap alloziiertes object A. Geht das?

    class A
    {
      public:
    	A() 
    	{	
    
    	}
    
    	void threadFunction() 
    	{	
    		//...
    	}
    
    };
    
    int main(int argc, char* argv[])
    {
    	A* myA= new A();
    
    	// Create new thread
    	HANDLE thread1 = CreateThread(
    		NULL,      
    		0,         
    		myA->threadFunction, 
    		NULL,      
    		0,         
    		NULL);     
             return 0;
    }
    


  • Nicht direkt. Du kannst nur freie Funktionen mit der richtigen Signatur an CreateThread übergeben. Du brauchst also eine Hilfsfunktion und kannst dann über lpParameter das Objekt und die aufzurufende Funktion mitgeben.



  • hmm. danke.
    warum ist das so und wie kann ich das lösen?



  • Weil CreateThread eine C Funktion ist. Eine Lösung über eine Hilfsfunktion habe ich ja schon genannt. Eine andere bessere Lösung wäre die std::thread Klasse von C++11 zu nutzen falls das möglich ist:

    std::thread thread1(&A::threadFunction, myA);
    


  • ich würde gern über die hilfsfunktion gehen.

    Ich versuche es momentan so:

    // Hilfsfunktion
    
    void test(void *ptr) 
    {
        //if (!ptr) return -1;
    
        static_cast< A*> (ptr)->threadFunction();
    }
    
    // im Aufruf dann
    
    int main(int argc, char* argv[])
    {
        A* myA= new A();
    
        // Create new thread
        HANDLE thread1 = CreateThread(
            NULL,      
            0,         
            test, 
            myA,      
            0,         
            NULL);     
             return 0;
    }
    

    Obiges funktioniert so nicht. Komme aber hier auch nicht weiter...über Hilfe würde ich mich freuen.



  • ich glaube ich muss noch casten.
    ist folgendes richtig und sauber?

    int main(int argc, char* argv[])
    {
        A* myA= new A();
    
        // Create new thread
        HANDLE thread1 = CreateThread(
            NULL,      
            0,         
            (LPTHREAD_START_ROUTINE)test, 
            myA,      
            0,         
            NULL);     
             return 0;
    }
    

    Aber warum klappt das den nicht mit einem heap Objekt? Also das warum würde mich interessieren...



  • gambo schrieb:

    Aber warum klappt das den nicht mit einem heap Objekt?

    Wo hat du irgendein Problem geschildert, das etwas mit dem Heap zu tun hat?

    gambo schrieb:

    ich glaube ich muss noch casten.
    ist folgendes richtig und sauber?

    Wenn du casten musst, sicher nicht.



  • Wo hat du irgendein Problem geschildert, das etwas mit dem Heap zu tun hat?

    im ersten post

    Wenn du casten musst, sicher nicht.

    versteh die Antwort nicht.



  • Aber du hast kein Problem mit einem Heap Objekt, oder hast du schon funktionierenden Code für ein Objekt auf dem Stack?

    Dein (LPTHREAD_START_ROUTINE) Case ist böse. Deine Funktion sollte sich statdessen an die Signatur halten. Das heißt der Rückgabewert ist nicht void sondern DWORD . Dann sollte es ohne diesen Cast gehen.



  • Das hat erst mal mit heap und stack nichts zu tun. Das Problem ist, dass die Threadfunktion eben eine Funktion im Thread ausführen will. Du kannst aber Memberfunktionen nur aufrufen, wenn Du eine Instanz einer Klasse hast.

    Woher soll eine Threadfunktion wissen, mit welchem Objekt sie eine Memberfunktion aufrufen soll, wenn Du ihm kein Objekt übergibst?

    Eine statische Memberfunktion ist dagegen möglich, da diese keine Instanz benötigt.


Anmelden zum Antworten