/// <summary> /// 添加定时任务 /// </summary> /// <param name="task"></param> /// <param name="taskInfo"></param> /// <returns></returns> private bool AddTimerTask(TimerTask task, TimerTaskInfo taskInfo) { if (!task.IsValidTask()) { return(false); } for (int i = 0; i < m_WheelArr.Length; i++) { int slotIndex = -1; int taskListIndex = -1; if (m_WheelArr[i].AddTimerTask(task, ref slotIndex, ref taskListIndex)) { taskInfo.WheelSlotIndex = slotIndex; taskInfo.TaskListIndex = taskListIndex; taskInfo.WheelIndex = i; break; } } if (taskInfo.WheelIndex < 0 || taskInfo.WheelSlotIndex < 0 || taskInfo.TaskListIndex < 0) { return(false); } m_TaskIndex++; task.Index = m_TaskIndex; taskInfo.Index = m_TaskIndex; m_TaskInfoDic.Add(taskInfo.Index, taskInfo); return(true); }
/// <summary> /// 添加定时任务,如果能添加到当前时间轮上则返回true,否则为False /// </summary> /// <param name="task">定时任务</param> /// <param name="slotIndex">任务当前位置</param> /// <param name="taskListIndex">在列表中位置</param> /// <returns></returns> internal bool AddTimerTask(TimerTask task, ref int slotIndex, ref int taskListIndex) { if (task.RemainingWheelInMS >= m_SlotSize * m_TickInMS) { slotIndex = -1; taskListIndex = -1; return(false); } int targetSlot = task.RemainingWheelInMS / m_TickInMS; if (targetSlot == 0) { targetSlot = 1; task.RemainingWheelInMS = 0; } else { task.RemainingWheelInMS = task.RemainingWheelInMS % m_TickInMS; } slotIndex = m_CurrentSlotIndex + targetSlot; slotIndex = slotIndex % m_SlotSize; if (m_SlotArr[slotIndex] == null) { m_SlotArr[slotIndex] = new List <TimerTask>(); } taskListIndex = m_SlotArr[slotIndex].Count; m_SlotArr[slotIndex].Add(task); return(true); }
/// <summary> /// 回收数据 /// </summary> /// <param name="task"></param> private void RecycleTimerTask(TimerTask task) { if (task != null) { task.OnClear(); m_IdleTimerTaskList.Add(task); } }
/// <summary> /// 添加定时任务 /// </summary> /// <param name="task"></param> /// <returns></returns> internal TimerTaskInfo AddTimerTask(TimerTask task) { TimerTaskInfo taskInfo = new TimerTaskInfo(); if (AddTimerTask(task, taskInfo)) { task.OnTaskStart(); return(taskInfo); } else { return(null); } }
/// <summary> /// 获取空闲的任务数据,将会被重复使用 /// </summary> /// <returns></returns> internal TimerTask GetIdleTimerTask() { TimerTask task = null; if (m_IdleTimerTaskList.Count == 0) { task = new TimerTask(); } else { task = m_IdleTimerTaskList[0]; m_IdleTimerTaskList.RemoveAt(0); } return(task); }
/// <summary> /// 添加定时任务 /// </summary> /// <param name="intervalInSec">触发时间间隔</param> /// <param name="totalInSec">总时长</param> /// <param name="startCallback">开始触发时回调</param> /// <param name="intervalCallback">每次时间间隔的回调</param> /// <param name="endCallback">定时结束时回调</param> /// <param name="callbackData">格外的参数</param> /// <returns></returns> public TimerTaskInfo AddTimer(float intervalInSec, float totalInSec, TimerCallback startCallback, TimerCallback intervalCallback, TimerCallback endCallback, object callbackData) { if (m_HTimerWheel == null) { return(null); } TimerTask task = m_HTimerWheel.GetIdleTimerTask(); task.OnReused(intervalInSec, totalInSec, startCallback, intervalCallback, endCallback, callbackData); return(m_HTimerWheel.AddTimerTask(task)); }
/// <summary> /// 指定 /// </summary> /// <param name="index"></param> /// <param name="taskList"></param> private void OnTimerWheelTrigger(int index, List <TimerTask> taskList) { for (int i = 0; i < taskList.Count; i++) { TimerTask task = taskList[i]; if (task == null) { continue; } TimerTaskInfo taskInfo = null; if (!m_TaskInfoDic.TryGetValue(task.Index, out taskInfo)) { continue; } if (task.RemainingWheelInMS == 0) { task.OnTrigger(); } if (taskInfo.IsClear()) { RecycleTimerTask(task); } else { m_TaskInfoDic.Remove(task.Index); taskInfo.OnClear(); if (task.IsValidTask()) { AddTimerTask(task, taskInfo); } else { RecycleTimerTask(task); } } } }