bool pei::EventManager::ProcessSyncEvents( EventPtr event ) { // we run the event list in reverse because we draw from bottom up if the z-order is equal LOCK_EM(); // ref to smart_ptr is fine...we won't go out of scope while we are in here EventHandlerMap::iterator fit = m_SyncHandlers.find( event->GetType() ); if ( fit != m_SyncHandlers.end() ) { EventHandlerList& eventProcessors = fit->second; EventHandlerList::reverse_iterator eit = eventProcessors.rbegin(); while ( eit != eventProcessors.rend() ) { EventProcessorPtr& processor = *eit++; if ( processor->Call( m_RenderManager, event ) ) { return true; } } } // Sync Event Handling EventHandlerList::reverse_iterator eit = m_SyncEventProcessors.rbegin(); while ( eit != m_SyncEventProcessors.rend() ) { EventProcessorPtr& processor = *eit++; if ( processor->Call( m_RenderManager, event ) ) { return true; } } return false; }
bool pei::EventManager::ProcessAsyncEvents( EventPtr event ) { // we run the event list in reverse because we draw from bottom up if the z-order is equal LOCK_EM(); // Do not create a thread per event - is hard to synchronize later. // E.g drop 5 files and you'll get 5 threads loading assets - trying to update the tree 5 times - and maybe spawning child threads...ends in a mess! // ref to smart_ptr is fine...we won't go out of scope while we are in here // per event handlers - only these are called async EventHandlerMap::iterator fit = m_AsyncHandlers.find( event->GetType() ); if ( fit != m_AsyncHandlers.end() ) { EventHandlerList& eventProcessors = fit->second; EventHandlerList::reverse_iterator eit = eventProcessors.rbegin(); while ( eit != eventProcessors.rend() ) { EventProcessorPtr& processor = *eit++; // default async method. only spawn thread for events which request that - no global async events #ifdef NO_ASYNC_EVENTS boost::shared_ptr<boost::thread>( new boost::thread( &pei::EventProcessor::Call, processor, m_RenderManager, event )); #else if ( processor->Call( *this, m_RenderManager, event ) ) { return true ; } #endif } } // Async Event Handling - this should probably be called before sync - but will introduce lag! EventHandlerList::reverse_iterator eit = m_AsyncEventProcessors.rbegin(); while ( eit != m_AsyncEventProcessors.rend() ) { EventProcessorPtr& processor = *eit++; if ( processor->Call( m_RenderManager, event ) ) { return true; } } return false; }