_endthreadex beendet alle Threads
-
Hallo,
ich bringe mir gerade Multi-Threading bei und habe mit folgendem Beispielcode ein kleines Problem:int main() { HANDLE hThrds[2]; DWORD aThreadID[2]; std::stringstream ssText; int iKey; char cAbfrage; bool bQuit,bStatus[2]; bQuit = bStatus[0] = bStatus[1] = false; while (!bQuit) { if(kbhit()) { cAbfrage = _getch(); switch (cAbfrage) { case 'q': case 'Q': { bQuit = true; break; } case 49: case 50: { ssText << cAbfrage; ssText >> iKey; iKey--; bStatus[iKey] = !bStatus[iKey]; if (bStatus[iKey]) { if (1 == iKey) hThrds[iKey] = (HANDLE) _beginthreadex(0,0, (unsigned (_stdcall *)(void *)) ThreadTwo, NULL,0, (unsigned *) &aThreadID[iKey]); else hThrds[iKey] = (HANDLE) _beginthreadex(0,0, (unsigned (_stdcall *)(void *)) ThreadThree, NULL,0, (unsigned *) &aThreadID[iKey]); } else { _endthreadex(aThreadID[iKey]); } break; } default: break; } } } for (iKey=0;iKey<2;iKey++) { if (bStatus[iKey]) _endthreadex(aThreadID[iKey]); CloseHandle(hThrds[iKey]); } return(0); }Leider ist es aber so, dass ich, wenn ich die 1 oder 2 drücke (also Zeichen 49 bzw. 50) auch die main-Funktion beendet wird? Woran liegt das?
Vielen Dank für eure Hilfe!
V.K.
-
VerbalKint schrieb:
Leider ist es aber so, dass ich, wenn ich die 1 oder 2 drücke (also Zeichen 49 bzw. 50) auch die main-Funktion beendet wird? Woran liegt das?
Daran, dass du _endthreadex benutzt. Diese Funktion tut nicht das, was du glaubst. Sie beendet nicht einen bestimmten Thread, der über den Parameter identifiziert wird, sondern den Thread, aus dem du sie aufrufst.
-
Okay, und wie kann ich dann einen bestimmten Thread beenden, den ich in der main-Funktion aufrufe?
Und wie könnte ich in der while-Schleife der main-Funktion abfragen, ob ein Thread noch läuft oder nicht?Danke schön!
V.K.
-
VerbalKint schrieb:
Okay, und wie kann ich dann einen bestimmten Thread beenden, den ich in der main-Funktion aufrufe?
Am saubersten, indem du dem Thread signalisierst, dass er sich selbst beenden soll.
VerbalKint schrieb:
Und wie könnte ich in der while-Schleife der main-Funktion abfragen, ob ein Thread noch läuft oder nicht?
WaitForSingleObject auf das Threadhandle.
-
Danke für die Hilfe.
V.K.