_beginthread mit TerminateThread beenden?



  • Moin,
    sagt mal kann ich überhaubt mit TerminateThread einen Thread abschißen den ich mit _beginthread erstellt hab?

    Also ich habs ausprobiert und bei mir gehts nicht - wie so?

    Mein Code (in etwa):

    static void MyDlg::MyThread(void * pthis)
    {
     while(true) Sleep(1000); // endlos Schleife
    }
    
    void MyDlg::TestThread(void)
    {
     _beginthread(MyThread, 0, this); // endlos-Thread starten
    
     TerminateThread(MyThread, 0); // wie so geht das nicht?
    }
    

    Also TerminateThread bekomme ich immer NULL zurück und das heißt laut MSDN:

    If the function fails, the return value is zero.

    Was muß ich TerminateThread übergeben damit das Funktioniert. Oder hab ich die Flasche Funktion dafür?



  • Hallo Xtreaft,
    den Parameter gibts du falsch.
    Es sollte so ähnlich sein:

    HANDLE hThread = (HANDLE) _beginthread(MyThread, 0, this);
    ::TerminateThread(hThread, 0);
    

    Aber, es ist keine gute Idee ein Thread mit TerminateThread zu enden.
    Mach das lieber mit einem Flag, und das Thread soll sich selbst beenden.

    Hoffentlich hast du verstanden was ich meine.



  • Joah Thx hab ich verstanden.

    Gibt es einen grund wie so ich einen Thread nicht abschießen soll?
    Speicherlag oder was erwartet mich dann?



  • Xtreaft schrieb:

    Gibt es einen grund wie so ich einen Thread nicht abschießen soll?

    • Der Thread-Stack wird nicht abgeräumt. Bei der Default-Einstellung hast Du so mal eben ein ganzes MB in Deinem Adressraum verbraten.
    • Die CRT allokiert innerhalb von _beginthread irgendwas um die 140 Byte. Die werden auch nicht freigegeben.
    • Es wird kein einziger dtor der Objekte aus Deinem Thread aufgerufen
    • Alle Ressourcen, die Du innerhalb des Threads angefordert hast, werden nicht freigegeben.

    Außerdem kannst Du das Handle von _beginthread vergessen. Es gibt keine Garantie, daß das Handle bis zum Einsatz gültig ist. Da mußt Du schon _beginthreadex verwenden (und dann natürlich zusätzlich CloseHandle).


Anmelden zum Antworten