ReleaseMutex geht nicht ((((

ich glaub ich hab den Fehler gefunden. stdin Handle wird niergendswo zurückgesetzt. Jetzt muss ich noch finden, wie man es macht.
 
wenn ich richtig verstehe, wird bei der Zeile
C++:
stdinHandle = GetStdHandle(STD_INPUT_HANDLE);
ein Handle auf die Konsole zurückgegeben, so dass man mit WaitForXXXObject() überprüfen kann, ob eine Eingabe durch den Benutzer erfolgt ist. Und wenn's passiert ist, wird der Status des Handle's niergendwo wieder verändert, damit die nächste abfrage blockierend wird... so was wie ResetEvent.
 
Zuletzt bearbeitet von einem Moderator:
ich hab jetzt im update-Thread folgendes eingebaut:
C++:
DWORD WINAPI update(LPVOID attr)
{      
    INPUT_RECORD irInBuf;
    DWORD changeEvent, cNumRead;
while(1){
...
      if (meldungscounter > 0)
        {
          ausgabe();

          changeEvent = WaitForMultipleObjects(2, events, FALSE, INFINITE);
          switch (changeEvent)
            {
          case WAIT_OBJECT_0 + 0: //es ist eine neue Meldung eingetroffen
            {
              break;
            }
          case WAIT_OBJECT_0 + 1: //es gab eine Konsoleneingabe
            {
              if (! ReadConsoleInput(
                              stdinHandle,      // input buffer handle
                              &irInBuf,     // buffer to read into
                              1,         // size of read buffer
                              &cNumRead) ) // number of records read

                {
                  cerr << "Lesen von der Konsole hat nicht funktionniert"<<endl;
                }
                         /// ErrorExit("ReadConsoleInput");
            //  cin >> eingabe;
                  switch (irInBuf.EventType)
                    {
                    case KEY_EVENT: // keyboard input
                      {
                        cin >>eingabe;
                      break;
                      }
                    default:
                      {
                        break;
                      }
                    }
              if (eingabe > 0 && eingabe <= 7)
                {
                  choice = eingabe;
                }
            //  ResetEvent(stdinHandl);
              break;
            }
            }
        }
      else
        {
          WaitForSingleObject(anzevent, INFINITE);
         /* if(ResetEvent(anzevent)==0)
            {
              cout << "Zurücksetzen des Events hat nicht geklappt: " + GetLastError();
            }*/
          choice = 0;
        }
}
}

und jetzt läuft das ganze in Endlosschleife und wird gar nicht blockiert...
 
Zuletzt bearbeitet von einem Moderator:
Bitte nicht so viele Doppelposts. Es gibt den "Edit" Knopf...
GetKeyState ist eine Möglichkeit. Oder wenn's auch reagieren soll, wenn das Fenster minimiert ist: GetAsyncKeyState(). Und falls du dann auch noch irgendeine Taste willst:
C:
BYTE bKeys[256];
while(TRUE){
	if(!GetKeyboardState(&bKeys)) break;
	for(int i = 0; i < 256; i++){
		if(bKeys[i] & 0x80){
			// Button Pressed (i == Virtual Key-Code)
		}else(bKeys[i] & 0x01){
			// Button Toggled (Caps Lock, Num Lock, ...)
		}
	}
	Sleep(1);
}

Gruss
cwriter
 
Zuletzt bearbeitet:
Zurück