/// <summary> /// 添加帧 /// </summary> /// <param name="frame"></param> public void AddFrame(BaseFrame frame) { if (!Frames.Contains(frame)) { AddFrames.Add(frame); } }
internal PExpr StepOver(Frame f, StepOverKind kind) { if (!f.IsResolved) { RuntimeError fError = null; if (kind != StepOverKind.InternalStepOver) { fError = _firstChanceError; _breakOnNext = kind == StepOverKind.ExternalStepIn; if (_hasTimeout) { _timeLimit = DateTime.UtcNow + _timeout; } } do { Debug.Assert(Frames.Contains(f)); if (fError != null) { PExpr r = _currentFrame.SetResult(fError); _currentFrame.DoDispose(); fError = null; } else { PExpr r = _currentFrame.VisitAndClean(); if (r.IsPending) { return(r); } } }while(!f.IsResolved); } return(new PExpr(f.Result)); }
/// <summary> /// 删除帧 /// </summary> /// <param name="frame"></param> public bool RemoveFrame(BaseFrame frame) { if (Frames.Contains(frame)) { frame.IsRemove = true; return(true); } return(false); }
/// <summary> /// Returns the next Frame in sequence /// </summary> /// <param name="Frame"></param> /// <returns></returns> public Frame GetNextFrame(Frame Frame) { if (Frame == null) { return(null); } if (!Frames.Contains(Frame)) { return(null); } int i = Frames.IndexOf(Frame); int FrameIndex = i + 1; if (FrameIndex > Frames.Count - 1) { return(null); } return(Frames[FrameIndex]); }
private async void Run() { try { var stop = new Stopwatch(); // 稳定帧回调用的时间池 |最后运行完成时间 long ticksPool = 0; while (status is Runing) { stop.Restart(); //删除帧 Frames.RemoveAll(p => { if (p.IsRemove) { p.Cancel(); return(true); } else { return(false); } }); //添加帧 if (AddFrames.Count > 0) { foreach (var frame in AddFrames) { if (!Frames.Contains(frame)) { Frames.Add(frame); } } AddFrames.Clear(); } Frames.Sort((a, b) => b.Priority.CompareTo(a.Priority)); //把所有帧取出 foreach (var current in Frames) { try { if (!current.IsWaitStatus) { current.Run(); } else { var diff_time = Convert.ToInt32((DateTime.Now.Ticks - current.LastTicks) / 10000); if (await current.Into(diff_time) == -99999) { current.Reset(); } } } catch (Exception er) { logger?.LogError(er, "run frame error"); } } var elapsedtick = stop.ElapsedTicks; ticksPool += elapsedtick; //等待时间 int waitMs; if (ticksPool > AverageTick) { ticksPool -= AverageTick; waitMs = 0; } else { waitMs = (int)(AverageTick - elapsedtick) / 10000; } await Task.Delay(waitMs); } Interlocked.CompareExchange(ref status, Idle, Stoping); } catch (Exception ex) { logger?.LogError(ex, "SynFrameScheduler Error"); } }
public List <Closure> FindRulesets(Selector selector) { return(Frames.Select(frame => frame.Find(this, selector, null)) .Where(f => !f.Any(c => Frames.Contains(c.Ruleset))) .FirstOrDefault(r => r.Count != 0)); }