Threads



  • Kann mir mal bitte jemand möglichst mit ein paar Codebeispielen erklären wie ich einen Thread staren kann, bestimmte Funktionen in ihm ausführen kann und ihn dann wieder ordnungsgemäß beenden kann?

    Ich hab schon gesucht und auch gefunden allerdings werde ich daraus ned schlau.

    Bin für jede Hilfe dankbar!



  • -> siehe unten 😃

    M.T.



  • Ja sorry ich hab dann mal nachgeschaut und diese alte Netscape Version die ich hab hat die Seite nich neu geladen so dass mein Thread noch ned da war, ich dachte dann das es einen Fehler beim erstellen gab und hab meine Frage nochmal gestellt!

    Also danke dir erstmal aber 2 Dinge noch:

    1.: Ich hab <process.h> includiert aber trotzdem kommt:

    error C2065: '_beginthread' : nichtdeklarierter Bezeichner

    2.: Wird die Funktion die ich _beginthread übergebe dann nur 1 mal ausgeführt und dann der Thread beendet oder läuft die dann in ner Endlosschleife bis ich den Thread beende??



  • Du musst, wenn du Visual C++ benutzt, "Multithreaded" einstellen.

    cu



  • Und wo stellt man das da ein? Ich habs ned gefunden...



  • OK ich habs geschafft multithreadet zu aktivieren, allerdings kommt jetzt folgender Fehler:

    error C2664: '_beginthread' : Konvertierung des Parameters 1 von 'void (void)' in 'void (__cdecl *)(void *)' nicht moeglich
    

    bei folgendem Code:

    void Thread()
    {
        MessageBox(NULL, "Code im Thread", "Code im Thread", NULL);
    }
    
    _beginthread(Thread, 0, NULL);
    


  • Also gut warum das ncih ging is mir jetz klar, ich hab das void * this_pointer vergessen, jetz wollte ich aus dem Konstruktor einer Klasse xy die Methode Thread aus der selben Klasse xy aufrufen, die Methode Thread sieht so aus:

    void xy::Thread(void * this_pointer);
    
    // Und der Aufruf im Konstruktor von xy:
    _beginthread(Thread, 0, this);
    

    Dabei kommt aber wieder ein Fehler und zwar:

    error C2664: '_beginthread' : Konvertierung des Parameters 1 von 'void (void *)' in 'void (__cdecl *)(void *)' nicht moeglich
    

    Was mach ich also nun wieder falsch, mit der globalen funktion die nicht Member der Klasse war hats ja auch funktioniert.

    Wie kann ich also -beginthread klarmachen dass die Funktion Member der Klasse xy ist?



  • die mehtode muss static sein



  • Ja das hab ich inzwischen auch rausgefunden, allerdings hab ich dann ja keinen zugriff mehr auf Membervariablen, ich hab mit der Suchfunktion eine Erklärung gefunden wie man dieses Problem umgehen kann. Indem man den this Zeiger an die Thread Funktion übergibt und anhand dessen Adresse auf die Membervariablen zugreifen kann, theoretisch hab ich das schon verstanden aber ich hab keinen Plan wie ich das in der Praxis umsetzen soll. Kann mir das bitte noch jemand zeigen?



  • damit kommst du wieder auf den void-pointer aus deinen ersten Fragen zurück... der hat schon nen grund...
    Der 3. Parameter von _beginthread ist dieser viod* der an der Thread übergeben wird.. geht das licht auf? nein?

    CMyClass::StartThread()
    {
       _beginthread(Thread, 0, this);
    } 
    CMyClass::Thread(void* lpClass)
    {
       CMyClass *_this = (CMyClass*)lpClass;
       _this->my_member = 0;
       ....
    }
    

Anmelden zum Antworten