Thread beenden und Status ermitteln



  • Hallo!

    1.) Mich würde aus Interesse interssieren, ob es einen anderen Weg gibt als einen Thread radikal mit TerminateThread zu beenden und ohne einer (globalen) boolesche Variablen (etc.)

    2.) Wie kann ich ermitteln ob ein Thread noch läuft an Hand des CWinThread-Objekts, dass AfxBeginThread zurückliefert. Geht das nur über GetExitCodeThread , oder kann ich eine Member-Variable vom CWinThread-Objekt nutzen?


  • Mod

    1. Kann der Thread siuch selber terminieren! Von außen sollte man ihm das mitteilen, dass er sich beenden soll. Das geht mit einer Variable, einem Event, einer Windowsnachricht (wenn der Thread Fenster hat), das geht auf mit jedem Ereignis, dass man im PC auswerten kann.
    2. In dem CWinThread Objekt ist ein Thtread handle, auf das man mit WaitForSingleObject waten kann.
    Achtung: Der Zeiger den AfxBeginThread liefert wird ungpltig, wenn das Objekt nicht autodelete auf false gesetzt hat



  • Martin Richter schrieb:

    1. Kann der Thread siuch selber terminieren! Von außen sollte man ihm das mitteilen, dass er sich beenden soll. Das geht mit einer Variable, einem Event, einer Windowsnachricht (wenn der Thread Fenster hat), das geht auf mit jedem Ereignis, dass man im PC auswerten kann.

    Ok, also geht es nur über den der "Nachricht" von außen.

    Martin Richter schrieb:

    2. In dem CWinThread Objekt ist ein Thtread handle, auf das man mit WaitForSingleObject waten kann.
    Achtung: Der Zeiger den AfxBeginThread liefert wird ungpltig, wenn das Objekt nicht autodelete auf false gesetzt hat

    Aha, an Hand der Member-Variablen ist das Prüfen also nicht möglich.
    Damit ich das zurückgebene Objekt von AfxBeginThread problemlos nutzen kann muss ich

    CWinThread * pThread = AfxBeginThread(MyThreadProc, NULL);
    if (pThread != NULL)
        pThread->m_bAutoDelete = FALSE;
    

    Wenn ich m_bAutoDelete auf FALSE gesetzt habe, muss ich dann irgendetwas selber zerstören am CWinThread-Objekt?


  • Mod

    1. Kann sich ein Thread selber beenden!
    2. Ist Dein Code unsicher.
    AfxBeginThread könnte einen Zeiger leifern, der aber schon ungültig ist, weil der Thread beendet ist. Deine Zuweisung von m_bAutoDelete würde ienen Crash verursachen.
    Am Besten setzt Du m_bAutoDelete in Deiner Threadfunktion auf FALSE.

    Ja! Und in diesem Fall musst Du das Objekt selbst entsorgen, wenn der Thread beendet ist.



  • Martin Richter schrieb:

    1. Kann sich ein Thread selber beenden!

    Klar, wie gesagt es ging mir nur um das Beenden von Außen.

    Martin Richter schrieb:

    2. Ist Dein Code unsicher.
    AfxBeginThread könnte einen Zeiger leifern, der aber schon ungültig ist, weil der Thread beendet ist. Deine Zuweisung von m_bAutoDelete würde ienen Crash verursachen.
    Am Besten setzt Du m_bAutoDelete in Deiner Threadfunktion auf FALSE.

    Ja! Und in diesem Fall musst Du das Objekt selbst entsorgen, wenn der Thread beendet ist.

    Hmm, das ist was dran.
    Zwei Fragen: Wie setzen ich m_bAutoDelete innerhalb der Thread-Funktion auf FALSE. Könnte ich den Thread nicht auch mit CREATE_SUSPEND starten, dann m_bAutoDelete auf FALSE setzen und den pThread->ResumeThread aufrufen?
    Wie entsorge ich das Objekt? Regulär wie einen Zeiger eben mit delete?


Anmelden zum Antworten