_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).