Anzeige friert ein!



  • Ich hab mich im Forum umgesehen und hab gemerkt, dass ich was falsches für nen Thread gehalten hab...
    Aber aus der Anleitung zur Erstellung eines Threads werde ich nicht schlau...
    kann wer helfen?





  • Ich find das noch ein Stückchen besser erklärt (jedenfalls hab ich es besser verstanden als ich das erste mal mit Threads arbeiten wollte): http://www.henkessoft.de/mfc_einsteigerbuch_kapitel17.htm

    Wieder mal der Dr.Henke, der alte Fuchs :p 😉



  • Also...ich habs jetzt mal versucht...allerdings bekomme ich jetzt folgende Fehlermeldung:

    error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'UINT (LPVOID)'
    c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\include\afxwin.h(4108): could be 'CWinThread *AfxBeginThread(CRuntimeClass *,int,UINT,DWORD,LPSECURITY_ATTRIBUTES)'
    while trying to match the argument list '(overloaded-function)'



  • Magst du uns nciht deinen Code zeigen?



  • jetzt läufts...aber die Funktionen
    MessageBox
    GetDlgItemText ... geben jetzt Fehler raus!
    (illegal call of non-static member function)
    wie kann ich das beheben?



  • Also da ich grad Zeit habe erkläre ich mal ganz kurz wie du einen Thread startest (aber eigentlich würds ja auch bei den 2 gegebenen Links stehen 😉 ):

    In der Headerdatei
    Was wichtig ist: Alle deine Thread-Funktionen müssen global oder statisch sein. Schreibe also beispielsweise:

    static UINT    DerNeueThread(LPVOID pParam);
    

    Die CPP-Datei
    Hier erstellst du eine ganz gewöhnliche Funktion, das einzige was wichtig ist um dann mit deinem Dialog "kommunizieren" zu können ist die erste Zeile in der Funktion:

    UINT CDeinDialogDlg::DerNeueThread(LPVOID pParam)
    {
        //Das hier ist wichtig
    	CDeinDialogDlg* pDlg   = (CDeinDialogDlg*)pParam;
    
        //Denn du kannst dann auf die Membervariablen deiner Dialogklasse zugreifen,  zum Beispiel so:
        pDlg->m_meineMemberVariable = "Der Neue Wert";
    
        //Da die Funktion den Typ UINT hat muss sie natürlich auch was zurückgeben
        return 0;
    }
    

    Diesen Thread starten
    Um ihm nun zu sagen dass er in einem neuen Thread starten soll, schreibst du an gewünschter Stelle:

    CWinThread* pDerNeueThread = AfxBeginThread(DerNeueThread, this);
    

    Und schon führt er das im neuen Thread aus. Was noch wichtig ist: Wie schon gesagt ist der neue Thread eigentlich komplett von deiner Klasse "abgekapselt" und du musst über Pointer und Handler gehen wenn du den Ursprungsdialog bearbeiten möchtest. Am besten ist, du schaust dir mal SendMessage an und versuchst damit zu arbeiten. Such einfach mal hier im Forum danach und du wirst sicherlich einige beispiele sehen. Und nochwas: Solltest du aus dem neuen Thread einen normalen Thread der Ursprungsklasse auszuführen sollte im anderen kein UpdateData() sein, das hat er nicht so gern 🙂 .

    Wenn du das erstmal geschafft hast wirst du bald merken wie das Ganze funktioniert...

    EDIT: Ok, ich war etwas zu spät. Hast es doch hingekriegt. Das wegen dem Problem: Schau dir an was ich hier geschrieben hab, du kannst nicht wie früher auf die Membervariablen zugreifen...



  • PERFEKT!
    Danke an alle!
    Das Programm funktioniert einwahnfrei!
    DANKE DANKE und nochmals DANKE!



  • Das Programm funktioniert einwahnfrei!

    Hat es keine Wahnvorstellungen mehr? 😃

    Dann bin ich ja froh :p



  • ...meine Rechtschreibung...ich weiß 🙄



  • @BAR
    Super Beitrag hat mir auch sehr geholfen, hatte auch ein Problem beim OnInitDialog, da ich dort Verzeichnisse rekursiv auslese und der Dialog erst erschien nach dem das gemacht wurde, funktioniert mit dem Thread jetzt echt super!

    Ab in die FAQ 👍



  • Naja ich denke nicht umbedingt dass der Beitrag in die FAQ sollte, das was ich geschrieben habe steht genau gleich bei Henkessoft und da ist es auch sehr verständlich geschrieben, es geht einfach noch weiter in Details.


Anmelden zum Antworten