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; }
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; // } //} }
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); }
public void RemoveComplexFigure(IComplexFigure removeItem) { WorldDispatcher.Invoke(() => { removeItem.Clear(); }); lock (CFigures) CFigures.Remove(removeItem); }
private void AddComplexFigure(IComplexFigure figure) { lock (CFigures) CFigures.Add(figure); }