Löschen eines Threads, der "hängt"



  • Hallo,

    das Hauptprogramm erzeugt mit CreateThread() einen Thread.
    Funktioniert wunderbar!

    Auch das Löschen ist keine Problem, wenn der Thread sich nicht aufgehängt hat:
    VERIFY(SetEvent(m_hEventKill));
    SetThreadPriority(PRIO_MAIN);
    WaitForSingleObject(m_hEventDead, INFINITE);
    WaitForSingleObject(m_hThread, INFINITE);
    delete this;

    Mein Problem: Wie kann ich diesen Thread wieder loswerden, wenn der Thread in einer Endlosschleife feststeckt?

    "delete pThread;" tut's leider nicht.

    Vielen Dank im Voraus!

    Gruß
    Jens



    1. CreateThread & c/c++ ist ne schlecht kombination. Nimm _beginthreadex

    Wie kann ich diesen Thread wieder loswerden, wenn der Thread in einer Endlosschleife feststeckt?

    Indem du die Endlosschleife beendest :p
    Die hard-code variante ist TerminateThread, ist aber nicht wirklich zu empfehlen, da diese funktion den thread einfach killt, ohne das du möglichkeit hast speicher, resourcen, ... freizugeben.



  • CMatt schrieb:

    1. CreateThread & c/c++ ist ne schlecht kombination. Nimm _beginthreadex

    Aus Interesse: Wieso?



  • Die c-runtime (_beginthreadex/beginthread) hängt an jeden thread nen speicherblock in dem globale c-variable wie onerr,_fmode, ... verwaltet werden.
    Wenn nun ein Thread mit CreateThread erzeugt wird, passiert das nicht. Ist nicht weiter tragisch wenn man nichts verwendet was auf diese globalen variablen zugreift. Sobald aber die erste c-funktion so eine variable lesen/schreiben möchte, wird dieser block nachträglich alloziert => memoryleak, denn die thread-exit routinen der WinAPI wissen nichts von deisem speicher block, also wird er auch nicht mehr frei gegeben.



  • Moin CMatt,

    CreateThread & c/c++ ist ne schlecht kombination. Nimm _beginthreadex

    Irgendwo habe ich gelesen, daß man das nicht tun soll, wenn man die MFC benutzt - was bei mir der Fall ist.

    Indem du die Endlosschleife beendest :p

    Ist in Wirklichkeit keine Endlosschleife, die das Problem verursacht, sondern die Funktion ReadFile() unter WinCE, die manchmal nicht terminieren mag und - soweit ich weiß - nicht asynchron aufgerufen werden kann. Deshalb der Umweg über den Thread.

    Die hard-code variante ist TerminateThread, ist aber nicht wirklich zu empfehlen, da diese funktion den thread einfach killt, ohne das du möglichkeit hast speicher, resourcen, ... freizugeben.

    TerminateThread() funktioniert ganz hervorragend!
    Das ist für mich der entscheidende Hinweis - besten Dank! 🙂

    Gruß
    Jens



  • Irgendwo habe ich gelesen, daß man das nicht tun soll, wenn man die MFC benutzt - was bei mir der Fall ist.

    Wie oben geschrieben, das hat nichts mit der MFC zu tun sondern mit der c-runtime. Denke was gu gelesen hast ist, dass in der MFC AfxBeginThread/CWinThread gibt, konnte mich mit dem Zeug aber noch nie wirklich anfreuden 🙂


Anmelden zum Antworten