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


Anmelden zum Antworten