Example #1
0
 /// <summary>
 /// 添加帧
 /// </summary>
 /// <param name="frame"></param>
 public void AddFrame(BaseFrame frame)
 {
     if (!Frames.Contains(frame))
     {
         AddFrames.Add(frame);
     }
 }
Example #2
0
 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));
 }
Example #3
0
 /// <summary>
 /// 删除帧
 /// </summary>
 /// <param name="frame"></param>
 public bool RemoveFrame(BaseFrame frame)
 {
     if (Frames.Contains(frame))
     {
         frame.IsRemove = true;
         return(true);
     }
     return(false);
 }
Example #4
0
        /// <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]);
        }
Example #5
0
        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");
            }
        }
Example #6
0
 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));
 }