/// <summary> /// Add new breakpoint to this provider. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="time">Time of new breakpoint.</param> /// <param name="context">Context of new breakpoint.</param> /// <param name="action">Action which will be called on new breakpoint.</param> /// <param name="priority">Priority of new breakpoint(breakpoints with lesser priority with same time called earlier).</param> /// <returns>Key of this breakpoint(positive ingeger number) or -1(if we can't add this breakpoint(For example time less than currentTime))</returns> public long AddBreakPoint <T>(HdDateTime time, T context, Action <HdDateTime, object> action, int priority = 0) { if (time < CurrentTime) { return(-1); } key++; BreakPoint breakPoint = memoryManager.New(); breakPoint.Time = time; breakPoint.CustomData = context; breakPoint.Priority = priority; breakPoint.BreakPointAction = action; breakPoint.NumberOfMessage = key; int _key; if (needPop) { memoryManager.Delete(breakPoints.Peek.Value); _key = breakPoints.ModifyTop(breakPoint).Key; needPop = false; } else { _key = breakPoints.Add(breakPoint); } breakPoint.Key = _key; return(_key); }
void GoToNextBreakPoint(HdDateTime destinationTime) { if (needPop) { memoryManager.Delete(breakPoints.Pop().Value); } if (breakPoints.Count == 0) { needPop = false; return; } BreakPoint breakPoint = breakPoints.Peek.Value; if (breakPoint.Time > destinationTime) { needPop = false; return; } needPop = true; long numberOfMessage = breakPoint.NumberOfMessage; CurrentTime = breakPoint.Time; int key = (int)breakPoint.Key; breakPoint.BreakPointAction(CurrentTime, breakPoint.CustomData); }