[C/C++] Thread aus Methode erstellen?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Mr.Smoke, 4. Mai 2009 .

  1. 4. Mai 2009
    Thread aus Methode erstellen?

    Hey...
    Ich habe eine Klasse in der eine Methode als Thread laufen soll.
    Ich will diesen Thread aus einer anderen Methode heraus starten.
    Ich verwende dazu CreateThread nun bekomme ich aber immer vom Kompiler folgende Meldung:

    Code:
    Dem Funktionsaufruf fehlt die Argumentliste. Verwenden Sie "&Klasse::Methode", um einen Zeiger auf den Member zu erstellen.
    Ich verwende Visual C++ 2008.

    Hat jmd ne Idee was der Fehler ist?

    Das ganze Funktionier übrigens wenn ich nicht mit Klassen arbeite!
     
  2. 4. Mai 2009
    AW: Thread aus Methode erstellen?

    Hm ja, mit Klassen ist das nicht so leicht, du hast nämlich bei einer Klassenfunktion (nicht bei statischen) immer noch einen zusätzlichen 1. Parameter, nämlich den this-Zeiger. Um solche Probleme zu umgehen wurde boost::bind() entwickelt. Damit kann man Klassen ganz normal als Funktionen aufrufen.

    Wenn du boost::bind() benutzt, dann kannst du btw. auch gleich boost::thread benutzen ^^
     
  3. 4. Mai 2009
    AW: Thread aus Methode erstellen?

    Okay, danke!
    Ich werde mir jetzt mal die Boost lib ankucken...

    Kennt jmd ein gutes Tut wie man das auch von "Hand" machen kann?
     
  4. 4. Mai 2009
    AW: Thread aus Methode erstellen?

    Hey. Deklarier die Methode als static und lege einen Container für die Instanz der Klasse.

    In deiner static Methode kannst du entweder einen static index integer anlegen, der sich bei jedem
    Aufruf selbst inkrementiert, und daher den Container index für seine eigene Instanz hast, oder du übergibst deinem Thread einfach den Index für die Instanz zu deinem Container per Argument.

    // EDIT: Hier ein Beispiel (ungetestet):

    Code:
    class CThread;
    
    std::vector<const CThread*> g_ThreadContainer;
    
    class CThread
    {
     private:
     HANDLE hThread;
    
     public:
     CThread(){}
     ~CThread(){}
     
     void Run( void )
     {
     g_ThreadContainer.push_back(this);
    
     size_t index = g_ThreadContainer.size()-1;
     this->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&CThread::ThreadProc, (void*)&index, 0, NULL); 
     }
    
     void Suspend( void )
     {
     // ...
     }
    
     virtual static DWORD WINAPI ThreadProc( int index )
     {
     const CThread *pInstance = g_ThreadContainer.at(index);
     return 0;
     }
    }/* class CThread */; 
     
  5. 4. Mai 2009
    AW: Thread aus Methode erstellen?

    Ich kann sie net static deklarieren, da ich darin nicht statische Parameter verwende..
     
  6. 4. Mai 2009
    AW: Thread aus Methode erstellen?

    Und dazu ist ja auch der Container da
     
  7. 4. Mai 2009
    AW: Thread aus Methode erstellen?

    Okay...
    Habe jetzt nicht wirklich verstanden was ich gerade mache, werde mich aber da einlesen!

    So der fehler bzgl. der Argumenten liste ist weg!
    Allerdings bekomme ich jetzt folgende Meldungen:
    Code:
    'virtual' kann nicht zusammen mit 'static' verwendet werden.
    Kann ich virtual einfach wegnehmen?

    Und der zweite:
    Code:
     Ungültiger Verweis auf nicht-statischen Member ...
    Muss ich denk member irgendwie speziell deklarieren ?
     
  8. 4. Mai 2009
    AW: Thread aus Methode erstellen?

    Ah. Sorry. So müsste es gehen:

    Code:
    class CThread;
    
    std::vector<const CThread*> g_ThreadContainer;
    
    class CThread
    {
     private:
     HANDLE hThread;
    
     public:
     CThread(){}
     ~CThread(){}
     
     void Run( void )
     {
     g_ThreadContainer.push_back(this);
    
     size_t index = g_ThreadContainer.size()-1;
     this->hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&CThread::ThreadProc, (void*)&index, 0, NULL); 
     }
    
     void Suspend( void )
     {
     // ...
     }
    
     static DWORD WINAPI ThreadProc( int index )
     {
     CThread *pInstance = g_ThreadContainer.at(index);
    
     return pInstance->Start();
     }
    
     protected:
     virtual DWORD Start( void )
     {
     return 0;
     }
    }/* class CThread */; 
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.