Thread programmierung mit Member zugriff ?



  • Hallo,versuch mich gerade an Threads wo ich den "this" Zeiger mit rübernehmen
    kann leider bekomme ich hier "CMeinThread::run()" diese Fehlermeldung
    "CMeinThread is not a class or namespace".

    Hat jemand eine Idee was ich falsch mache,bin Anfänger also nicht lachen. 😃

    class CThread {
    public:
            CThread();
            virtual ~CThread();
            virtual void *run();
            static void *entry( void *pArg );
            void start();
    protected:
            pthread_t               m_thread;
            pthread_attr_t  m_threadAttr;
    }; 
    CThread::CThread()
    {}
    
    CThread::~CThread()
    {}
    
    void *CThread::entry( void *pArg )
    {
     CThread         *pobjSelf = (CThread *) pArg;
     return pobjSelf->run();
    }
    void *CThread::run()
    {
    return NULL;
    }
    
    void CThread::start()
    {
    pthread_create( &m_thread, NULL, entry, this );
    } 
    
    //MeinKlasse//
    CThread CMeinThread;
    
    //Ueberschriebene Funktion//
    
    CMeinThread::run()
    {
     //Eigener Code als Thread
     return NULL;
    }
    
    int main()
    {
    CMeinThread.run();
    
    }
    


  • Hallo

    CMeinThread ist eine Klasse, du brauchst aber eine Instanz der Klasse um die Methode aufrufen zu können. Du solltest erstmal die Grundlagen der OOP beherschen, bevor du mit Threads rumspielst.

    bis bald
    akari



  • Das ganze ist ja nicht auf meinem Mist gewachsen,das ist aus einer Newsgroup,
    und da lief es.



  • Das soll aber schon c++ sein, oder?



  • Ja soll C++ sein.
    Würde euch nicht nerven,wenn ich nicht seit ein paar Stunden suche.
    Ich möchte eine Memberfunktion in einem Thread aufrufen.

    Danke



  • Also, wenns C++ sein soll und du nicht mal ne Memberfunktion aufrufen kannst, dann lern die Grundlagen.



  • Das hat mit Grundlagen nichts zu tun,weil Memberfunktion im pthread doch schon
    etwas kompliziertes für mich ist.

    Nichts für ungut.



  • Die Funktion, die an pthread_create übergeben wird, muss C linkage haben. So ein Programm könnte laufen:

    extern "C" {
    #include <pthread.h>
    }
    
    class Thread {
    public:
       virtual ~Thread();
       void start();
       void finish();
    
       virtual void * run() = 0;
    
    private:
       pthread_t m_thread;
    };
    
    namespace {
       extern "C" void * thread_entry_function(void * arg) {
          Thread * thread = static_cast<Thread *>(arg);
          return thread->run();
       }
    }
    
    Thread::~Thread() {
    }
    
    void Thread::start() {
       pthread_create(&m_thread, NULL, thread_entry_function, this);
    } 
    
    void Thread::finish() {
       pthread_join(m_thread, NULL);
    }
    
    class MeinThread : public Thread {
    
       virtual void * run() {
           //Hier eigener Code rein.
          return NULL;
       }
    };
    
    int main() {
       MeinThread mt;
       mt.start();
       mt.finish();
    }
    


  • @Ponto
    Ich war ein paar Tage nicht zu Hause.
    Danke für den Code !



  • akari schrieb:

    Hallo

    CMeinThread ist eine Klasse, du brauchst aber eine Instanz der Klasse um die Methode aufrufen zu können. Du solltest erstmal die Grundlagen der OOP beherschen, bevor du mit Threads rumspielst.

    bis bald
    akari

    IMHO ist CMainThread eine Instanz von CThread:

    //MeinKlasse// 
    CThread CMeinThread;
    

    Aber der Link schadet dennoch nicht 😃



  • Einer Instanz kann man aber keine Methoden überschreiben:

    CMeinThread::run()
    {
     //Eigener Code als Thread
     return NULL;
    }
    


  • Ja, deswegen schadet der Link ja nich 🤡


Anmelden zum Antworten