Example #1
0
        public void Stop()
        {
            _runEngine = false;
            _thread?.Abort();
            //_stepThread?.Abort();
            IEnumerable <IFigure> figures;

            lock (Figures) figures = Figures.ToList();
            foreach (var figure in figures)
            {
                RemoveFigure(figure);
            }
            Figures.Clear();

            IEnumerable <IComplexFigure> cfigures;

            lock (Figures) cfigures = CFigures.ToList();
            foreach (var figure in cfigures)
            {
                RemoveComplexFigure(figure);
            }
            CFigures.Clear();

            TextInfos.Clear();

            _thread?.Abort();
            //_stepThread?.Abort();
            //_stepThread = null;
        }
Example #2
0
        private void DoTheStepTimeout(float time)
        {
            var sw = Stopwatch.StartNew();

            WorldDispatcher.Invoke(() =>
            {
                World.Step(time);

                IEnumerable <IComplexFigure> cfigures;
                lock (Figures) cfigures = CFigures.ToList();
                foreach (var figure in cfigures)
                {
                    figure.Step(time);
                }
                if (WorldFriction != 1f)
                {
                    IEnumerable <IFigure> figures;
                    lock (Figures) figures = Figures.ToList();
                    foreach (var figure in figures)
                    {
                        figure.LinearVelocity *= (1f - WorldFriction);
                    }
                }
            });



            //while (!_stepWorkDone)
            //{
            //    Thread.Sleep(1);
            //    if (sw.ElapsedMilliseconds > 35000)
            //    {
            //        Debug.WriteLine("ABORT SLOW CALC!");

            //        IEnumerable<IFigure> removes;
            //        lock (Figures) removes = Figures.AsEnumerable().Reverse().Take(Figures.Count / 10);
            //        Debug.WriteLine($"Removing items: {removes.Count()}/{Figures.Count}");
            //        lock (Figures)
            //        {
            //            lock (_syncClearItem)
            //            {
            //                foreach (var remove in removes)
            //                {
            //                    remove.Clear();
            //                    Figures.Remove(remove);
            //                }
            //            }
            //        }
            //        _stepThread?.Abort();
            //        _stepThread = null;
            //        break;
            //    }
            //}
        }
Example #3
0
        public void MainEngineLoop()
        {
            //_timer.Stop();
            DateTime now      = DateTime.Now;
            var      stepSize = now.Subtract(_lastRun);

            _lastRun = now;

            var swa = Stopwatch.StartNew();

            DoTheStepTimeout((float)stepSize.TotalSeconds);
            FrameNo++;
            FrameRenderTime = now;
            if (swa.ElapsedMilliseconds > 70)
            {
                Debug.WriteLine($"stepTime: {(int)stepSize.TotalMilliseconds} - STEP: {(int)swa.ElapsedMilliseconds}");
            }
            swa.Stop();

            List <IFigure> objects;

            lock (Figures) objects = Figures.ToList();
            foreach (var figure in objects)
            {
                if (figure.IsOutOfBounds)
                {
                    RemoveFigure(figure);
                    Debug.WriteLine($"REMOVED OUT OF PLACE BALL");
                }
            }

            List <IComplexFigure> cobjects;

            lock (CFigures) cobjects = CFigures.ToList();
            foreach (var figure in cobjects)
            {
                if (figure.IsOutOfBounds)
                {
                    RemoveComplexFigure(figure);
                    Debug.WriteLine($"REMOVED OUT OF PLACE BALL");
                }
            }
            var sleep   = _sleepDuration;
            var elapsed = (int)DateTime.Now.Subtract(now).TotalMilliseconds;

            if (sleep > elapsed)
            {
                Thread.Sleep(sleep - elapsed);
            }
            Thread.Sleep(1);
        }
Example #4
0
 public void RemoveComplexFigure(IComplexFigure removeItem)
 {
     WorldDispatcher.Invoke(() => { removeItem.Clear(); });
     lock (CFigures) CFigures.Remove(removeItem);
 }
Example #5
0
 private void AddComplexFigure(IComplexFigure figure)
 {
     lock (CFigures) CFigures.Add(figure);
 }