void GlobalEventQueue::Cycle( ncycle_t steps )
{
    EventQueue *nextEventQueue;
    ncycle_t iterationSteps = 0;

    while( iterationSteps < steps )
    {
        ncycle_t nextEvent = GetNextEvent( &nextEventQueue );

        ncycle_t globalQueueSteps = 0;
        if( nextEvent > currentCycle )
        {
            globalQueueSteps = nextEvent - currentCycle;
        }

        /* Next event occurs after the current number of steps. */
        if( globalQueueSteps > (steps - iterationSteps))
        {
            currentCycle += steps - iterationSteps;
            Sync( );
            break;
        }

        ncycle_t localQueueSteps = nextEventQueue->GetNextEvent( ) - nextEventQueue->GetCurrentCycle( );
        nextEventQueue->Loop( localQueueSteps );

        currentCycle += globalQueueSteps;
        iterationSteps += globalQueueSteps;

        Sync( );
    }
}