GetExitCodeThread(*,*)



  • Hallo zusammen

    Ich habe hier ein Problem mit meinem Thread. Starten und laufen und so tut er wunderbar, nur wenn z.B. ein Button gedrückt wird, soll der Thread sich beenden und das Dialogfenster schließen.

    Hab ich folgendermaßen implementiert:

    //Header

    void Starten();
    static UINT AuswertungStarten (LPVOID pParam);
    

    //CPP

    //Starten()
    
    //hier kommt ne ganze Reihe von Code und in der Schleife ist folgende bedingung:
    
    if ( abbruch ) //wird mit true gefüllt wenn button gedrückt wird
    {
         AfxEndThread(1,TRUE);
    }
    
    //AuswertungStarten()
    UINT CClassDlg::AuswertungStarten(LPVOID pParam)
    {
    	CClassDlg* pDlg = (CClassDlgg*) pParam;
    	pDlg->Starten();
    	return 0; 
    }
    
    //Cancel Button
    
    this->abbruch = TRUE;
    DWORD ExitCode;
    GetExitCodeThread(AuswertungStarten,&ExitCode);
    if ( ExitCode == 1 )
        OnCancel();
    

    Starten tue ich den Thread wie folgt:

    AfxBeginThread(AuswertungStarten,this);
    

    Komischerweise steht direkt vor dem starten des Threads, nach starten des Threads und nach beedigung des Threads immer der gleiche Wert in ExitCode.

    Ich hab keine Ahnung woran das liegt.



  • Naja, wenn du denn exitcode holst ist dein thread ja noch nicht beendet, auf 'abbruch' wird doch erst später reagiert.



  • ja gut ok

    aber dann müsste er zugehen, wenn ich das zweite mal druf klicke

    das tut er ja auch net


  • Administrator

    CWinThread* m_pThread = AfxBeginThread(...);
    

    1. Speichere irgendwo den gewonnen Zeiger von AfxBeginThread, wohl am besten in eine Membervariable.

    //Cancel Button
    
    this->abbruch = TRUE;
    while(WaitForSingleObject(m_pThread->m_hThread, INFINITE) != WAIT_OBJECT_0);
    DWORD ExitCode;
    GetExitCodeThread(m_pThread->m_hThread,&ExitCode);
    if(ExitCode == 1)
        OnCancel();
    

    2. Warte mit WaitForSingleObject und dem Handle des Threads darauf, bis der Thread auch beendet wurde.

    3. Wie machst du das eigentlich mit dem abbruch? Im Cancel Button Code hast du ein this->abbruch aber im Thread nur ein abbruch. Ich hoffe du weisst, was du da tust *g*

    Grüssli



  • ja, abbruch is ne member

    hab nur das this vergessen *zwinka*

    aber das hört sich gut an

    ich proebiere das gleich aus

    danke schonmal



  • ...dann must du aber auch innerhalb deiner Threadfunktion auf abbruch reagieren und nicht im dialog.

    Edit: .. machst Du schon 🙄 ...war gestern bei Robbie 😉


  • Administrator

    Gerade noch einen Fehler entdeckt. Mich hat das GetExitCodeThread schon vorhin gestört, dass du dem einen Zeiger auf deine Funktion übergibst, doch ich habe damit noch nie gearbeitet und deshalb nicht weiterüberlegt. Nun habe ich allerdings endlich in der MSDN nachgeschaut und siehe da ... GetExitCodeThread verlangt ein Handle auf deinen Thread und einen Zeiger auf eine DWORD Variable. Ich habe es oben editiert und führe es hier nochmals auf:

    DWORD dwExitCode = 0;
    GetExitCodeThread(m_pThread->m_hThread, &dwExitCode);
    

    Grüssli



  • jepp, das tu ich ja auch

    dann beende ich den thread



  • Dravere schrieb:

    Gerade noch einen Fehler entdeckt. Mich hat das GetExitCodeThread schon vorhin gestört, dass du dem einen Zeiger auf deine Funktion übergibst, doch ich habe damit noch nie gearbeitet und deshalb nicht weiterüberlegt. Nun habe ich allerdings endlich in der MSDN nachgeschaut und siehe da ... GetExitCodeThread verlangt ein Handle auf deinen Thread und einen Zeiger auf eine DWORD Variable. Ich habe es oben editiert und führe es hier nochmals auf:

    DWORD dwExitCode = 0;
    GetExitCodeThread(m_pThread->m_hThread, &dwExitCode);
    

    Grüssli

    jo sicher; stand da ja auch; aber da ich den zeiger bis eben noch nicht zugewiesen hatte, habe ich halt die funktion übergeben 😉



  • hey, es funktioniert *ggg*

    dankeschön 😉


  • Mod

    Boch mal was grundsätzliches, wenn man CWinThread* m_pThread = AfxBeginThread(...); ausführt, dann zerstört sich das CWinThread Objekt sofort wenn der Thread terminiert. Wenn man also noch was kontrollieren will, oder gar auf den Thread warten will, dann muss man m_bAutoDelete auf FALSE setzen und das Objekt selber per delete entsorgen!


  • Administrator

    Ups ... da hat er sogar recht.
    Ehm ... aber wenn man m_bAutoDelete verändert, sollte man dann den Thread nicht mit CREATE_SUSPENDED starten? Bzw. als Codeausschnitt:

    m_pThread = AfxBeginThread(AuswertungStarten, (LPVOID)this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    if(m_pThread != NULl)
    {
        m_pThread->m_bAutoDelete = FALSE;
        m_pThread->ResumeThread();
    }
    else
    {
        // Thread konnte nicht gestartet werden.
    }
    

    Grüssli



  • alles klar

    hab ich jetzt alles auch so gemacht

    nur: wie lösche ich den thread? einfach mit Delete(); ?

    Edit: Neee, er wirft mir zwar keinen Fehler aus, aber dafür Memory Leaks *wein*


  • Mod

    Nicht Delete() sondern delete!


Anmelden zum Antworten