SleepEx mit GetMessage
-
Hallo,
SleepEx ist ja eine Funktion, die solange wartet, bis entweder die angegebenen Millisekunden abgelaufen sind, oder die IO-Funktion beendet ist.
Gibt es eine Möglichkeit, SleepEx auch für GetMessage zu nutzen, sodass SleepEx auch zurückkehrt, sobald eine Nachricht abgerufen wurde?
Also in etwa so:while( 1 ) { int millisLeft = 500; do { millisLeft = SleepEx(millisLeft, GetMessage( &msg, NULL, 0, 0 )); if (millisLeft) //Nachricht wurde abgerufen, jetzt verarbeiten { if (msg.message == WM_KEYDOWN) { if (msg.wParam == VK_ESCAPE) { quitGame = 1; break; } } TranslateMessage(&msg); DispatchMessage(&msg); } } while (millisLeft); if (quitGame) break; }Danke schonmal,
Rufus
-
Dazu kanst Du MsgWaitForMultipleObjects verwenden indem Du einfach kein Objekt zum weiteren Warten angibst!
-
WaitMessage
-
Danke für die Antworten, aber mit WaitMessage komm ich nicht weiter und mit MsgWaitForMultipleObjects weiß ich nicht wie ich das anwenden muss, was macht die Funktion genau? was sind das für Objekte? ich hätt es jetzt mal so versucht:
while( 1 ) { int millisLeft = 500; int result; do { result = MsgWaitForMultipleObjects(0, NULL, 0, millisLeft, QS_ALLINPUT ); if (result == WAIT_TIMEOUT) { GetMessage( &msg, NULL, 0, 0 ); if (msg.message == WM_KEYDOWN) { if (msg.wParam == VK_ESCAPE) { quitGame = 1; break; } } TranslateMessage(&msg); DispatchMessage(&msg); } } while (result != WAIT_TIMEOUT); }Allerdings funktioniert das so nicht. Wie muss man das machen?
-
Kannst du mal beschreiben was du da überhaupt vorhast? Das sieht schon ziemlich merkwürdig aus.
-
Wenn das Ergebnis "WAIT_TIMEOUT" war, dann wurde in dieser Zeit *keine* Nachricht empfangen... also solltest Du lieber
if (result != WAIT_TIMEOUT) { GetMessage( &msg, NULL, 0, 0 ); if (msg.message == WM_KEYDOWN) { if (msg.wParam == VK_ESCAPE) { quitGame = 1; break; } } TranslateMessage(&msg); DispatchMessage(&msg); }verwenden....
PS: Für was brauchst Du überhaupt den Timeout?
PPS: Ob das überhaupt ohne Wait-Handle geht....PPPS: Das was Du machen willst, kannst Du auch ganz ohne MsgWait... machen!
-
@5
Ich programmiere zur Zeit ein Tetris-Spiel. Dazu will ich in bestimmten Zeitabständen den Block immer um eins nach unten verschieben. Allerdings kann dazwischen natürlich der Block gedreht und verschoben werden, also muss ich auch das abprüfen.Ich hab es jetzt so gelöst, ganz zufrieden bin ich aber nicht:
while( 1 ) { int millisToWait = 1500; DWORD start; do { start = GetTickCount(); MsgWaitForMultipleObjects(0, NULL, 0, millisToWait, QS_KEY ); millisToWait -= GetTickCount() - start; if (millisToWait > 0) //Nachricht vorhanden { GetMessage( &msg, NULL, 0, 0 ); if (msg.message == WM_KEYDOWN) { switch (msg.wParam) { case VK_ESCAPE: quitGame = 1; break; case VK_LEFT: spiel.translateBlock(); ausgabe << "links wurde gedrückt..." << endl; break; case VK_RIGHT: spiel.rotateBlock(1); ausgabe << "rechts wurde gedrückt..." << endl; break; case VK_UP: spiel.rotateBlock(); break; } if (msg.wParam == VK_UP || msg.wParam == VK_LEFT || msg.wParam == VK_RIGHT) redraw(feld); } TranslateMessage(&msg); DispatchMessage(&msg); } } while (millisToWait > 0); spiel.updatePos(); redraw(feld); if (spiel.finished() || quitGame) break; }@Jochen
Du hast geschrieben ich bräuchte dazu kein MsgWait, welche Alternativen gibt es?
-
Was soll den dies!?
if (millisToWait > 0) //Nachricht vorhandenHast Du Dir jemals die Doku zu MsgWaitFor... durchgelesen!?????
-
Im Internet gibt es genug Anleitungen darüber wie man die Nachrichtenschleife für Spiele gestaltet. So gut wie alle benutzen PeekMessage.
-
Wie wärs mit nem Timer ?!