[SDL] Eventqueue loeschen
-
moin moin!
Ich hab ein kleines Problem mit dem Eventhandling bei SDL. Das Problem: ich reagiere in einer Event-Loop auf ein SDL_KEYDOWN der Escape-Taste damit, dass ich die Loop beende. Danach wird eine neue Event-Loop gestartet. Als allererstes werden dort die SDL-eigene Eventqueue geloescht (bzw. das sollte sie zumindest). Danach soll auf ein SDL_KEYUP der Escape-Taste reagiert werden...
Geht aber leider nicht. Wenn ich in meinem Programm Escape druecke, wird nicht nur die erste, sondern sofort auch die 2te Eventloop beendet.
Es ist logisch kein Problem, das ganze zu umgehen, indem ich in der 2ten Eventloop auch nur auf SDLK_DOWN - Events reagiere. Ich bin nur zufaellig auf das Problem gestossen und es wuerde mich interessieren, ob das ein Bug in SDL ist, ob ich die Doku missverstanden hab oder wo das Problem sonst liegen koennte.Hier mein kleiner Testcode:
#include <SDL.h> #include <stdio.h> void queue1() { SDL_Event event; while (1){ while (SDL_PollEvent(&event)){ switch (event.type){ case SDL_KEYDOWN: if (event.key.keysym.sym == SDLK_a) return; } } } } void queue2() { SDL_Event event; /* warte ein wenig, damit SDL_KEYUP Events auch sicher * in die Queue kommen, bevor sie gleich geloescht wird */ SDL_Delay(100); /* loesche Queue... SDL_PollEvent(0) gibt true, solang * etwas in der Queue steht * SDL_PollEvent(&event) loescht den letzten Event aus * der Queue und speichert ihn in event */ while (SDL_PollEvent(0)) SDL_PollEvent(&event); while (1){ while (SDL_PollEvent(&event)){ switch (event.type){ case SDL_KEYUP: if (event.key.keysym.sym == SDLK_a){ return; } } } } } int main(int argc, char** argv){ SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE); queue1(); queue2(); SDL_Quit(); }
Eigentlich sollte man zwei mal "A" druecken muessen um das Programm zu beenden, aber in der Tat reicht nur 1 mal... Warum?
-
Es ist schon ganz logisch:
Man drückt die Taste A und KEY_DOWN wird ausgelöst -> die erste schleife wird verlassen und das programm geht in die zweite.
Man lässt die Taste los und KEY_UP wird ausgelöst -> die zweite Schleife beendet.Wenn du schnell genug drückst, bekommt die zweite schleife vielleicht nichts mehr von dem KEY_UP mit. Ohne einem delay müsstest du da aber sehr sehr schnell sein
-
[] Autocogito
Bye, TGGC (Keine Macht den Dummen)
-
DrGreenthumb schrieb:
Es ist schon ganz logisch:
Man drückt die Taste A und KEY_DOWN wird ausgelöst -> die erste schleife wird verlassen und das programm geht in die zweite.
Man lässt die Taste los und KEY_UP wird ausgelöst -> die zweite Schleife beendet.Wenn du schnell genug drückst, bekommt die zweite schleife vielleicht nichts mehr von dem KEY_UP mit. Ohne einem delay müsstest du da aber sehr sehr schnell sein
ja, aber deshalb gibts in queue2() ja das SDL_Delay()...
EDIT: ok, hat sich erledigt, eine laengere Verzoegerung in SDL_Delay und die Sache funktioniert... thx anyway