CreateThread aus Klasse heraus aufrufen



  • #include <iostream>
    #include <windows>
    using namespace std;
    
    class test
    {
    public:
            void CallThread();
            void ExecThread();
    };
    
    void test::CallThread()
    {
            CreateThread(0,0,(LPTHREAD_START_ROUTINE)test::ExecThread , 0 ,0,0);
    }
    
    void test::ExecThread()
    {
       cout<<"ich bin ein thread\n";
    }
    
    int main()
    {
    test t;
    
    t.CallThread();
    
    return 0;
    }
    

    [C++ Fehler] file.cpp(47): E2235 Elementfunktion muß aufgerufen oder ihre Adresse übernommen werden

    Wie macht man es richtig? Ich kann mit der Fehlermeldung nicht alt so viel Anfangen. 😞



  • Das Problem ist, dass die an CreateThread uebergebene Methode statisch sein muss, sofern es sich um einen Klassenmember handelt. Deklarier sie als static. Um dann spaeter trotzdem an die Variablen der Klasse ranzukommen nutzt man idR das LPVOID-Argument, dass man in CreateThread uebergeben kann, indem man in der Starter-Methode den this-Zeiger uebergibt. In der Thread-Funktion castest du dann von LPVOID zurueck nach Klasse* und kannst damit arbeiten.

    EDIT: Welchen Compiler verwendest du? Eigentlich muesste es meines Wissens nach Windows.h heissen. Da es aber (der Fehlermeldung nach zu urteilen) kein VS ist kann das schon anders sein.
    Und guck mal, ob du alternativ std::thread nehmen kannst. Zumindest unter VS hat sich CreateThread nicht mit der CRT vertragen (Memory-Leak), mal abgesehen davon, dass std::thread garantiert auf jedem C++11-Unterstutzenden Compiler verfuegbar ist.



  • #include <iostream> 
    #include <windows>
    using namespace std;
    
    class test
    {
    public:
             void CallThread();
             void ExecThread();
    };
    
    void test::CallThread()
    {
    static test obj;
             CreateThread(0,0,(LPTHREAD_START_ROUTINE)obj.ExecThread , 0 ,0,0);
    }
    
    void test::ExecThread()
    { 
        cout<<"ich bin ein thread\n";
    }
    
    int main()
    {
    test t;
    t.CallThread();
    
    return 0;
    }
    

    [C++ Fehler] file.cpp(15): E2235 Elementfunktion muß aufgerufen oder ihre Adresse übernommen werden

    Noch immer das selbe. 😞

    Hab ich wieder was falsch gemacht oder liegt es an meinem uralten Borland Compiler?

    Wenn ich zuhause bin versuch ich es mal mit Visual Studios 2010



  • ...



  • Siehe Swordfish und unter VS _beginthread .



  • Lies mal noch meinen Beitrag bezüglich Cast nach LPTHREAD_START_ROUTINE:
    http://www.c-plusplus.net/forum/p1720570#1720570



  • So ist das gemeint:

    #include <process.h>
    
    class Test
    {
    	static unsigned int __stdcall StartThread1(void* param)
    	{
    		return reinterpret_cast<Test*>(param)->Thread1();
    	}
    
    	unsigned int Thread1()
    	{
    		return 0;
    	}
    public:
    	void CallThread()
    	{
    		_beginthreadex(0, 0, StartThread1, 0, 0, 0);
    	}
    };
    


  • Danke für die Tipps, mit Visual Studios 2010 funktionieren die Sachen der alte Borland kram kennt kein _beginthreadex.


Anmelden zum Antworten