B
Uhh deine Thread-Synchronisation sieht nicht gut aus.
Ich kann das Verhalten deines Programms komplett nachvollziehen sofern nach dem Systemstart _kbhit() nur einmal eine Zahl != 0 zurückliefert.
while(Stop==false){
if(_kbhit()){
char c=_getche();
switch(c){
case's':PulseEvent(StartEvent);break;
case'q':SetEvent(StopEvent);Stop=true;break; //Threads & While-Schleife beenden
default:break;
}
if(WaitForSingleObject(StopEvent,INFINITE)==WAIT_OBJECT_0) Stop=true;break; // Auf das Stop Event des Threads(Läufer) warten
}
}
Dann würde deine Schleife nämlich an dem WaitForSingleObject() unendlich lange auf StopEvent warten, während die Threads laufen.
DWORD WINAPI Laeufer(void *Data){
...
// Aufs StartEvent warten
while(true){
if(WaitForSingleObject(Daten->StartEv,100)==WAIT_OBJECT_0)
break;
}
Ok, die Threads dürften bis hier ohne Problem laufen. Aber danach passiert folgendes:
//-----------Bis zur 70ten Spalte(Das Ziel) bewegen-------------//
EnterCriticalSection(&cs_console);
for(int i=0;i<70;i++){
if(WaitForSingleObject(Daten->StopEv,100)==WAIT_OBJECT_0)
break;
con.setCurPos(Daten->ID+i,1);cout << Daten->Symbol;Sleep(x);
Daten->Bahnnummer=Daten->Bahnnummer+1; // für Rückgabe
}
LeaveCriticalSection(&cs_console);
// Ziel erreicht, an Threads Stop Event senden
SetEvent(Daten->StopEv);
EnterCriticalSection(&cs_console);
con.setCurPos(0,6); cout << "Sieger: " << Daten->ID;
LeaveCriticalSection(&cs_console);
Thread X startet und nimmt die CS (Critical Section) in Anspruch. Wenn jetzt irgentein anderer Thread startet, wird er durch die CS blockiert. Ist ja der Sinn von CS. Sobald der Thread X aber die CS wieder freigibt, wird sofort das StopEvent in den Signaled Zustand überführt s.d. der Haupthread fortfahren kann (WaitForSingleObject(StopEvent...), die Schleife beendet und danach alle Threads terminiert.