From 59818a253ddb27d5bd5dc26f7eb71a7f73a02342 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 14 Oct 2009 01:27:54 +0000 Subject: [PATCH] processing events in the engine thread git-svn-id: svn://anubis/anaglym/trunk@80 99a6e188-d820-4881-8870-2d33a10e2619 --- anaglym.cc | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/anaglym.cc b/anaglym.cc index 21f831f..c9ef4ee 100644 --- a/anaglym.cc +++ b/anaglym.cc @@ -22,7 +22,7 @@ static void update(); static void addEvent(const Event & event); static Uint32 updateCallback(Uint32 interval, void * param); -static bool lastDrawCompleted; +static bool lastUpdateCompleted; static bool engine_running; static SDL_Event userEvent; static SDL_cond * event_condition; @@ -46,6 +46,31 @@ static int engine_thread(void * param) { SDL_mutexP(event_mutex); SDL_CondWait(event_condition, event_mutex); + bool moreEvents = true; + while (moreEvents) + { + Event event; + SDL_mutexP(event_queue_mutex); + if (event_queue.size() < 1) + moreEvents = false; + else + { + event = event_queue.front(); + event_queue.pop(); + } + SDL_mutexV(event_queue_mutex); + if (moreEvents) + { + /* process the event */ + switch (event.type) + { + case EVENT_UPDATE: + g_engine->update(); + lastUpdateCompleted = true; + break; + } + } + } } } engine_running = false; @@ -82,7 +107,7 @@ int main(int argc, char * argv[]) usage(); } - lastDrawCompleted = true; + lastUpdateCompleted = true; engine_running = true; /* setup SDL update event */ userEvent.type = SDL_USEREVENT; @@ -114,7 +139,7 @@ int main(int argc, char * argv[]) /* called by SDL when the update timer expires */ static Uint32 updateCallback(Uint32 interval, void * param) { - if (lastDrawCompleted) + if (lastUpdateCompleted) SDL_PushEvent(&userEvent); return interval; } @@ -157,6 +182,7 @@ static void update() { Event update_event; update_event.type = EVENT_UPDATE; + lastUpdateCompleted = false; addEvent(update_event); }