(MFC mit dem...) Threads in Klassen mit Dialogen



  • Ich hab nen Dialog, bei öffnen des Dialoges wird ja die funktion OnInitDialog() aufgerufen, in der Funktion soll er nun nen thread aufrufen, das geschiet aber irgendwie nich. Es kommt immer die Fehlermeldung:
    ...\Prog1.cpp(87) : error C2664: 'CreateThread' : Konvertierung des Parameters 3 von 'unsigned long (void *)' in 'unsigned long (__stdcall *)(void *)' nicht moeglich
    Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein

    Was meint der damit?

    BOOL Prog1::OnInitDialog() 
    {
    
        CreateThread(NULL,0,Prog1::Recive,(LPVOID)para,0,&tid);
            MessageBox("Thread erstellt","INFO",0);
    }
    
    DWORD Prog1::Recive(LPVOID pParam)
    {
        MessageBox("THREAD, OK","INFO",0);
        return 0;
    
    }
    

    [ Dieser Beitrag wurde am 16.11.2002 um 15:50 Uhr von TheDeath editiert. ]



  • Problem ist :

    Ein Thread in der WinAPI muss so aussehen :
    DWORD Thread (LPVOID pParam)

    bei dir sieht das aber so aus :
    DWORD KlassenName::Thread (LPVOID pParam)

    Du musst den Klassennamen loswerden, am einfachsten geht das indem du deine Funktion als static deklarierst.



  • So, das hab ich jetzt hinbekommen, aber nu meldet der nen fehler wenn ich UpdateData(FALSE) ausführen will:
    error C2065: 'UpdateData' : nichtdeklarierter Bezeichner

    Ich hab die meine Thread-Funktion jetzt ausserhalb der klassen in ner header-datei deklariert, kann das dadran liegen?

    Hallo? Hilfe!!!

    [ Dieser Beitrag wurde am 16.11.2002 um 15:49 Uhr von TheDeath editiert. ]



  • Kann mir den keiner helfen?



  • Weißt Du denn nicht, was eine statische Methode ist? 😉

    Du kannst aus einer statischen Methode nur auf Klassenvariablen und Klassenmethoden zugreifen, also solche, die auch als static deklariert sind. Für alle anderen brauchst Du einen this-Zeiger.

    Eine Möglichkeit ist, diesen Zeiger über lParam zu übergeben. Aus Deinem Code ist nicht klar zu erkennen, ob Du den Wert bereits für etwas anderes verwendest, aber falls nicht:

    CreateThread(NULL,0,Prog1::Recive,(LPVOID)this,0,&tid);

    In der Threadfunktion:

    Prog1* pThis = (Prog1*) lParam;
    pThis->NichtStatischeFunktion();

    Ich glaube aber mich zu erinnern, dass UpdateData aus einem anderen Thread heraus ohnehin nicht oder nicht richtig funktioniert. Schick Dir lieber selbst eine Nachricht (Post), die kommt im richtigen Thread-Kontext an.



  • UpdateData? Eindeutig MFC...

    Vielleicht gibts ja mit der MFC eine elegante Möglichkeit. 🙂


Anmelden zum Antworten