예제 #1
0
    /**
     * Register an event handler to listen to events of type /eventName/,
     * from the given sender only.
     */
    public void RegisterClockEvent(EventDefine eventName, ClockEventHandler handler, long startTimeTicks, long timeSpanSeconds)
    {
        //when you regist a clock event it may has been elapse some timeSpan
        DateTime clockBegin  = new DateTime(startTimeTicks);
        DateTime currentDate = DateTime.Now;

        long     elapsedTicks = currentDate.Ticks - clockBegin.Ticks;
        TimeSpan elapsedSpan  = new TimeSpan(elapsedTicks);

        long totalSeconds = Convert.ToInt64(elapsedSpan.TotalSeconds);

        // there is /count/ timeSpan between start time and now
        long count = totalSeconds / timeSpanSeconds;

        for (long i = 0; i < count; i++)
        {
            handler(eventName);
        }

        // reset start time ticks to a reason value
        startTimeTicks += count * timeSpanSeconds * Global.SECOND_TO_TICKS;

        if (!ContainClockEvent(eventName))
        {
            m_ClockEvents.Add(new ClockEventClass(eventName, handler, startTimeTicks, timeSpanSeconds));
        }
        else
        {
            int index = GetClockEventIndex(eventName);
            m_ClockEvents[index] = new ClockEventClass(eventName, handler, startTimeTicks, timeSpanSeconds);
        }
    }
예제 #2
0
 public ClockEventClass(ClockEventClass copy)
 {
     m_Name = copy.m_Name; m_LastUpdateTime = copy.m_LastUpdateTime; m_TimeSpan = copy.m_TimeSpan; m_handler = copy.m_handler;
 }
예제 #3
0
    void Update()
    {
        //process all clock event
        for(int i = 0; i < m_ClockEvents.Count; i++)
        {
            DateTime clockBegin = new DateTime(m_ClockEvents[i].m_LastUpdateTime);
            DateTime currentDate = DateTime.Now;

            long elapsedTicks = currentDate.Ticks - clockBegin.Ticks;
            TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);

            long totalSeconds = Convert.ToInt64(elapsedSpan.TotalSeconds);

            // there is /count/ timeSpan between start time and now
            if(totalSeconds > m_ClockEvents[i].m_TimeSpan)
            {
                long count = totalSeconds / m_ClockEvents[i].m_TimeSpan;
                for( long j = 0; j < count ; j++ )
                {
                    m_ClockEvents[i].m_handler(m_ClockEvents[i].m_Name);
                }

                // reset start time ticks to a recent value
                ClockEventClass updatedEvent = new ClockEventClass(m_ClockEvents[i]);
                updatedEvent.m_LastUpdateTime += count * m_ClockEvents[i].m_TimeSpan * Global.SECOND_TO_TICKS;
                m_ClockEvents[i]= updatedEvent;
            }
        }

        //add all the event
        for(int i = 0; i < m_AddEvents.Count; i++)
        {
            Dictionary<object, List<PriorityEventHandler>> handlers = m_EventDictionary[m_AddEvents[i].m_Name];
            if (!handlers.ContainsKey(m_AddEvents[i].m_Sender))
                handlers[m_AddEvents[i].m_Sender] = new List<PriorityEventHandler>();
            handlers[m_AddEvents[i].m_Sender].Add(m_AddEvents[i].m_handler);
        }
        m_AddEvents.Clear();

        // remove all the removed Events
        for( int i = 0; i < m_RemoveEvents.Count; i++)
        {
            if (m_EventDictionary.ContainsKey(m_RemoveEvents[i].m_Name))
            {
                if (m_EventDictionary[m_RemoveEvents[i].m_Name].ContainsKey(m_RemoveEvents[i].m_Sender))
                {
                    m_EventDictionary[m_RemoveEvents[i].m_Name][m_RemoveEvents[i].m_Sender].Remove(m_RemoveEvents[i].m_handler);
                    if (m_EventDictionary[m_RemoveEvents[i].m_Name][m_RemoveEvents[i].m_Sender].Count == 0 && m_RemoveEvents[i].m_Sender != AllSenders)
                        m_EventDictionary[m_RemoveEvents[i].m_Name].Remove(m_RemoveEvents[i].m_Sender);
                }
                else
                {
                    //Debug.Log("Sender not find " + ev.m_Sender.ToString());
                }
            }
        }
        m_RemoveEvents.Clear();

        // Copy m_WaitingEvents to another list to avoid concurrent modification:
        for ( int i = 0; i < m_WaitingEvents.Count; i++)
            m_ActiveEvents.Add(m_WaitingEvents[i]);
        m_WaitingEvents.Clear();

        //debug info
        //if (m_ActiveEvents.Count > 0)
        //      Debug.Log("Current Active Event :" +  m_ActiveEvents.Count);

        for ( int i = 0; i < m_ActiveEvents.Count; i++ )
        {

            //Debug.Log("Event :" + m_ActiveEvents[i].m_Name.ToString("g"));
            //double curTime = SystemTime.time;
            object sender = m_ActiveEvents[i].m_Sender;
            Dictionary<object, List<PriorityEventHandler>> handlers = m_EventDictionary[m_ActiveEvents[i].m_Name];

            // The handlers for this sender, plus the handlers for no
            // specific sender ("AllSenders")
            IEnumerable<PriorityEventHandler> listeningHandlers = handlers[AllSenders];
            int eventCounter = 0;
            if (handlers.ContainsKey(sender))
                listeningHandlers = listeningHandlers.Union(handlers[sender]);
            for( int j = 0; j < priorityList. Count; j++ )
            {
                foreach (PriorityEventHandler handler in listeningHandlers)
                {
                    eventCounter++;
                    if( handler.m_priority == priorityList[j] )
                    {
                        handler.m_handler(m_ActiveEvents[i].m_Name, sender, m_ActiveEvents[i].m_Args);

                    }
                }
            }
            //Debug.Log("Finishe Event :" + m_ActiveEvents[i].m_Name.ToString("g") + " takes:" + (SystemTime.time - curTime));
            //Debug.Log(ev.m_Name.ToString() + " " + eventCounter);
        }

        //if (m_ActiveEvents.Count > 0)
        //      Debug.Log("Finishe All Events");

        m_ActiveEvents.Clear();
    }
예제 #4
0
    /**
     * Register an event handler to listen to events of type /eventName/,
     * from the given sender only.
     */
    public void RegisterClockEvent(EventDefine eventName, ClockEventHandler handler, long startTimeTicks, long timeSpanSeconds)
    {
        //when you regist a clock event it may has been elapse some timeSpan
        DateTime clockBegin = new DateTime(startTimeTicks);
        DateTime currentDate = DateTime.Now;

        long elapsedTicks = currentDate.Ticks - clockBegin.Ticks;
        TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);

        long totalSeconds = Convert.ToInt64(elapsedSpan.TotalSeconds);

        // there is /count/ timeSpan between start time and now
        long count = totalSeconds / timeSpanSeconds;
        for( long i = 0; i < count ; i++ )
        {
            handler(eventName);
        }

        // reset start time ticks to a reason value
        startTimeTicks += count * timeSpanSeconds * Global.SECOND_TO_TICKS;

        if( !ContainClockEvent(eventName))
        {
            m_ClockEvents.Add(new ClockEventClass(eventName, handler, startTimeTicks, timeSpanSeconds));
        }
        else
        {
            int index = GetClockEventIndex(eventName);
            m_ClockEvents[index] = new ClockEventClass(eventName, handler, startTimeTicks, timeSpanSeconds);
        }
    }
예제 #5
0
 public ClockEventClass(ClockEventClass copy)
 {
     m_Name = copy.m_Name; m_LastUpdateTime = copy.m_LastUpdateTime; m_TimeSpan = copy.m_TimeSpan; m_handler = copy.m_handler;
 }
예제 #6
0
    void Update()
    {
        //process all clock event
        for (int i = 0; i < m_ClockEvents.Count; i++)
        {
            DateTime clockBegin  = new DateTime(m_ClockEvents[i].m_LastUpdateTime);
            DateTime currentDate = DateTime.Now;

            long     elapsedTicks = currentDate.Ticks - clockBegin.Ticks;
            TimeSpan elapsedSpan  = new TimeSpan(elapsedTicks);

            long totalSeconds = Convert.ToInt64(elapsedSpan.TotalSeconds);

            // there is /count/ timeSpan between start time and now
            if (totalSeconds > m_ClockEvents[i].m_TimeSpan)
            {
                long count = totalSeconds / m_ClockEvents[i].m_TimeSpan;
                for (long j = 0; j < count; j++)
                {
                    m_ClockEvents[i].m_handler(m_ClockEvents[i].m_Name);
                }

                // reset start time ticks to a recent value
                ClockEventClass updatedEvent = new ClockEventClass(m_ClockEvents[i]);
                updatedEvent.m_LastUpdateTime += count * m_ClockEvents[i].m_TimeSpan * Global.SECOND_TO_TICKS;
                m_ClockEvents[i] = updatedEvent;
            }
        }

        //add all the event
        for (int i = 0; i < m_AddEvents.Count; i++)
        {
            Dictionary <object, List <PriorityEventHandler> > handlers = m_EventDictionary[m_AddEvents[i].m_Name];
            if (!handlers.ContainsKey(m_AddEvents[i].m_Sender))
            {
                handlers[m_AddEvents[i].m_Sender] = new List <PriorityEventHandler>();
            }
            handlers[m_AddEvents[i].m_Sender].Add(m_AddEvents[i].m_handler);
        }
        m_AddEvents.Clear();

        // remove all the removed Events
        for (int i = 0; i < m_RemoveEvents.Count; i++)
        {
            if (m_EventDictionary.ContainsKey(m_RemoveEvents[i].m_Name))
            {
                if (m_EventDictionary[m_RemoveEvents[i].m_Name].ContainsKey(m_RemoveEvents[i].m_Sender))
                {
                    m_EventDictionary[m_RemoveEvents[i].m_Name][m_RemoveEvents[i].m_Sender].Remove(m_RemoveEvents[i].m_handler);
                    if (m_EventDictionary[m_RemoveEvents[i].m_Name][m_RemoveEvents[i].m_Sender].Count == 0 && m_RemoveEvents[i].m_Sender != AllSenders)
                    {
                        m_EventDictionary[m_RemoveEvents[i].m_Name].Remove(m_RemoveEvents[i].m_Sender);
                    }
                }
                else
                {
                    //Debug.Log("Sender not find " + ev.m_Sender.ToString());
                }
            }
        }
        m_RemoveEvents.Clear();

        // Copy m_WaitingEvents to another list to avoid concurrent modification:
        for (int i = 0; i < m_WaitingEvents.Count; i++)
        {
            m_ActiveEvents.Add(m_WaitingEvents[i]);
        }
        m_WaitingEvents.Clear();

        //debug info
        //if (m_ActiveEvents.Count > 0)
        //      Debug.Log("Current Active Event :" +  m_ActiveEvents.Count);

        for (int i = 0; i < m_ActiveEvents.Count; i++)
        {
            //Debug.Log("Event :" + m_ActiveEvents[i].m_Name.ToString("g"));
            //double curTime = SystemTime.time;
            object sender = m_ActiveEvents[i].m_Sender;
            Dictionary <object, List <PriorityEventHandler> > handlers = m_EventDictionary[m_ActiveEvents[i].m_Name];

            // The handlers for this sender, plus the handlers for no
            // specific sender ("AllSenders")
            IEnumerable <PriorityEventHandler> listeningHandlers = handlers[AllSenders];
            int eventCounter = 0;
            if (handlers.ContainsKey(sender))
            {
                listeningHandlers = listeningHandlers.Union(handlers[sender]);
            }
            for (int j = 0; j < priorityList.Count; j++)
            {
                foreach (PriorityEventHandler handler in listeningHandlers)
                {
                    eventCounter++;
                    if (handler.m_priority == priorityList[j])
                    {
                        handler.m_handler(m_ActiveEvents[i].m_Name, sender, m_ActiveEvents[i].m_Args);
                    }
                }
            }
            //Debug.Log("Finishe Event :" + m_ActiveEvents[i].m_Name.ToString("g") + " takes:" + (SystemTime.time - curTime));
            //Debug.Log(ev.m_Name.ToString() + " " + eventCounter);
        }

        //if (m_ActiveEvents.Count > 0)
        //      Debug.Log("Finishe All Events");

        m_ActiveEvents.Clear();
    }