External exception C0000008 bei CloseHandle



  • for ( std::vector < FuncThreads * >::iterator It = ThreadPool.begin(); It < ThreadPool.end(); It++ ){
        DWORD ExitCode;
        GetExitCodeThread((*It)->hThread,&ExitCode);
        TerminateThread((*It)->hThread,ExitCode);
        CloseHandle((*It)->hThread);
        delete *It;
      }
    

    Hi,

    hab das problem das wenn ich den Handle des threads schließen will er mir ne exception wirft, aber ich weiß nicht so recht wieso o.o...

    schließt terminate thread bereits den handle?



  • es waren korrupte thread handles . ^.- sry



  • Unabhängig davon, daß Du den korrupten Handle gefixt hast:
    Ein kleiner Tipp, um solche Fehler frühzeitig erkennen zu können:

    In Deinem obigen Beispiel sollst Du die Rückgabewerte von TerminateThread() und CloseHandle() auswerten!
    Entweder zur Laufzeit (dann wird aber der Nutzer damit konfrontiert und somit hilflos) oder besser in der Debug-Version mit VERIFY()-Statements absichern.

    Stefan Kuhr erklärt sehr anschaulich anhand eines Fehler-Beispiels dieses Verhalten:
    http://mcblogs.craalse.de/sku?s=VERIFY&sentence=AND
    etwas weiter runter zum Abschnitt "What's wrong with this code? Antwort"

    Gerade bei zwei oder mehreren Threads ist je nach Situation die Fehlersuche bei korrupten Handles sehr schwierig!

    Just my 5 cents
    Martin


  • Mod

    Und TerminateThread gehört sich sowieso nicht!



  • Und wenn man einen Thread mit einem blocking call jeglicher Art beenden will? Dann hängt das Programm halt, oder wie?

    (Btw. warum hat _endtrhead()/_endthreadex() keinen Parameter für ein Handle? Oder kann man einen mit _beginthreadex() erstellten Thread mit TerminateThread() terminieren?)



  • Johnny2 schrieb:

    Und wenn man einen Thread mit einem blocking call jeglicher Art beenden will? Dann hängt das Programm halt, oder wie?

    (Btw. warum hat _endtrhead()/_endthreadex() keinen Parameter für ein Handle? Oder kann man einen mit _beginthreadex() erstellten Thread mit TerminateThread() terminieren?)

    Du weisst warscheinlich nicht wo _endtrhead()/_endthreadex() korrrekter Weise im Programm steht, hab ich recht? Diese beiden Funktionen stehen am Ende des durch _beginthreadex() erstellten Threads und nicht irgendwo aussen vor wie du vermutlich vermutet hast. Warum man die nun ans Ende der Funktion schreibt, weiss ich auch nicht. Die Frage kann dir aber sicher einer der Fachleute hier erläutern.

    Was verstehest du unter blocking call jeglicher Art, eine sauber programmierte Anwendung hängt nicht. Wenn du den Thread von aussen zu Beenden wünschst, dann bau in den Threat irgendeine Abfrage ein, die ein Eingreifen ermöglicht, und beende dann den Thread korrekt.



  • Und wenn im Thread auf eine named pipe gewartet wird? Und was ist mit einem blocking recv() call?


Anmelden zum Antworten