/** * 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); } }
public ClockEventClass(ClockEventClass copy) { m_Name = copy.m_Name; m_LastUpdateTime = copy.m_LastUpdateTime; m_TimeSpan = copy.m_TimeSpan; m_handler = copy.m_handler; }
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(); }
/** * 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); } }
public ClockEventClass(ClockEventClass copy) { m_Name = copy.m_Name; m_LastUpdateTime = copy.m_LastUpdateTime; m_TimeSpan = copy.m_TimeSpan; m_handler = copy.m_handler; }
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(); }