Thread beenden ...



  • Also ich habe in meinem Thread eine while schleife laufen und möchte als Sicherheit eine Art Stoptaste einbauen.
    Wenn ich nun meine Stoptaste drücke mache ich folgendes -->

    DWORD exitcodethread;
    GetExitCodeThread(m_Thread->m_hThread, &exitcodethread)
    m_Thread =(threadklasse*)
    TerminateThread(m_Thread->m_hThread,exitcodethread);
    

    um den Thread zu beenden.
    Funktioniert soweit nur kommt eine Windowsfehlermeldung -->

    Die Anweisung bla bla bla . Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden.

    Klicken Sie OK .....

    Anscheinend kann ich den Thread nicht einfach so abbrechen oder?
    Gibt es vielleicht eine andere schönere Lösung?

    Danke



  • Ich handhabe das bisher so, dass ich eine bool Variable nutze.
    Wenn ich den Thread starte, dann setze ich die auf TRUE. Sobald ich Stop drücke, dann halt auf FALSE.
    Im Thread dann nur noch in der while-Schleife die Variable abfragen.



  • d.h. Du läßt den Thread dann einfach auslaufen oder wie?
    Es muss doch aber eine andere Lösung geben, die ein wenig einfacher ist ohne das ich in meiner While Schleife noch eine habe nur um das zu kontrollieren oder?
    😕 😕



  • Du hast mich falsch verstanden. Ich habe auch nur eine while-Schleife.
    Bsp:

    UINT myThread(LPVOID pParam)
    {
        CMyClass* pCLass = (CMyClass*) pParam;
        do_something....
    
        while (!pCLass->bBeenden)
        {
            do_something....
        }
        return 0K;
    }
    


  • skorpions77 schrieb:

    d.h. Du läßt den Thread dann einfach auslaufen oder wie?
    Es muss doch aber eine andere Lösung geben, die ein wenig einfacher ist ohne das ich in meiner While Schleife noch eine habe nur um das zu kontrollieren oder?
    😕 😕

    Der einzige richtige weg ist ein return, also ein auslaufen lassen. TerminateThread ist schlehct, da du dann keine changen mehr hast irgend was aufzuräumen und du keine ahnung hast wo der thread grad steht (können dann sehr leicht halb fertige sachen raus kommen die danach schwierigkeiten machen).

    Den thread mitteilen das er jetzt fertig hat kannst du über ne variable oder ein event. Bei 'normalen' variable sollte du nur drauf achten das sie als volatile deklariert sind, dann optimiert keine dran drum und wert wird jedes mal neu ausm RAM geladen (wenn du das nicht machen würdest, könnte der compiler deinen code z.b so optimieren das bBeenden dauernt in einem register liegt. Wenn nun thread 2 bBeenden ändert bekommt das thread 1 niemals mit, da bBeenden aus dem CPU register nicht aus der RAM verwendet wird).



  • ok danke ...

    werde ich einmal so probieren.

    🙂 🙂 🙂



  • [quote="CMatt"]

    skorpions77 schrieb:

    ...Bei 'normalen' variable sollte du nur drauf achten das sie als volatile deklariert sind, dann optimiert keine dran drum und wert wird jedes mal neu ausm RAM geladen (wenn du das nicht machen würdest, könnte der compiler deinen code z.b so optimieren das bBeenden dauernt in einem register liegt. Wenn nun thread 2 bBeenden ändert bekommt das thread 1 niemals mit, da bBeenden aus dem CPU register nicht aus der RAM verwendet wird).

    Das wusste ich auch nicht. Bei mir gab es bisher nämlich keine Probleme aber kann ich ja mal vorsichtshable mit volatile deklarieren. Danke. 😉


Anmelden zum Antworten