Beispiel #1
0
GHOST_IEvent* GHOST_EventManager::popEvent()
{
	GHOST_IEvent* event = peekEvent();
	if (event) {
		m_events.pop_back();
	}
	return event;
}
void processEvents() {
    Event* event = NULL;
    Time processTime;
    Time platformTime;
    getRealTime(&platformTime);
    set_imask(15);
    event = peekEvent(NULL);
    while (event && higherPriority(event)) {
        safeToProcess(event, &processTime);
        if (compareTime(platformTime, processTime) >= 0) {
            queuePriority(event);
            removeAndPropagateSameTagEvents(event);
            setCurrentModelTag(event);
            set_imask(0);
            fireActor(event);
            getRealTime(&platformTime);
            set_imask(15);
            freeEvent(event);
            stackedDeadlineIndex--;
            event = NULL;
        }
        else {
            if (compareTime(processTime, lastTimerInterruptTime) == LESS) {
                lastTimerInterruptTime.secs = processTime.secs;
                lastTimerInterruptTime.nsecs = processTime.nsecs;
                setTimedInterrupt(&processTime);
            }
        }
        event = peekEvent(event);
    }
    /*
    if (stackedModelTagIndex >= 0) {
        currentMicrostep = executingModelTag[stackedModelTagIndex].microstep;
        currentModelTime = executingModelTag[stackedModelTagIndex].timestamp;
        stackedModelTagIndex--;
    } else {
        DBG(("cannot restore model tag\r\n"));
    }
    */
    set_imask(0);
}
Beispiel #3
0
bool ATOM_EventDispatcher::dispatchPendingEvents (void)
{
  for (;;)
  {
    ATOM_EventQueue::EventDispatchInfo info;
    if (!peekEvent (&info, true))
    {
      return false;
    }

    if (info.handler && info.handlerMap)
    {
	  // accquire the lock to prevent the handler been destroyed while the handler is involving.
      ATOM_Mutex::ScopeMutex lock(_handlerSetLock);
      
      HandlerSetIter it = _handlerSet.find (info.handler);
      if (it != _handlerSet.end ())
      {
        _handlerSet.erase (it);

        ATOM_EventTrigger *trigger = *info.trigger;

        if (trigger)
        {
          trigger->setHost (info.handler);
          trigger->setHandlerProc (info.handlerProc);
          trigger->handleEvent (info.event);
        }
        else
        {
          info.handlerMap->handleEvent(info.handler, info.event);
        }
      }
    }
	else
	{
        handleEvent (info.event);
	}

    ATOM_DELETE(info.event);
  }
}