private void run() { // Each iteration of this loop will consume all items in 'tasks'. while (workEvent.WaitOne() && !stopRunning) { try { statusString = "working"; while (tasks.Count > 0 && !stopRunning) { SolverTask task = (SolverTask)tasks.Dequeue(); DateTime start = DateTime.Now; isWorking = true; double[] throttles = solver.run(thrusters, task.direction, task.rotation); isWorking = false; resultsQueue.Enqueue(new SolverResult(task.key, throttles)); _calculationTime.value = (DateTime.Now - start).TotalSeconds; calculationTime = _calculationTime; } statusString = "idle"; } catch (InvalidOperationException) { // Dequeue() failed due to the queue being cleared. } catch (Exception e) { errorString = e.Message + " ..[" + e.Source + "].. " + e.StackTrace; } } }
public override void Step(float elapsedSec) { if (Input.IsKeyPressed(ConsoleKey.Escape)) { if (Solver != null) { if (SolverCommand != null) { SolverCommand.ExitConditions.ExitRequested = true; } if (SolverTask != null) { SolverTask.Wait(); SolverTask.Dispose(); SolverTask = null; SolverCommand = null; SolverState = null; Solver = null; } } Parent.ShowLibrary(); } if (Input.IsKeyPressed(ConsoleKey.Backspace)) { if (Solver != null) { if (SolverCommand != null) { SolverCommand.ExitConditions.ExitRequested = true; if (SolverTask != null) { SolverTask.Wait(); SolverTask.Dispose(); SolverTask = null; SolverCommand = null; SolverState = null; Solver = null; } } } } if (Solver is null) { if (Input.IsKeyPressed(ConsoleKey.F) || Input.IsKeyPressed(ConsoleKey.Enter)) { RunSolverWith(new SingleThreadedForwardSolver(new SolverNodeFactoryTrivial())); } if (Input.IsKeyPressed(ConsoleKey.R)) { RunSolverWith(new SingleThreadedReverseSolver(new SolverNodeFactoryTrivial())); } else if (Input.IsKeyPressed(ConsoleKey.M)) { RunSolverWith(new MultiThreadedForwardReverseSolver(new SolverNodeFactoryTrivial())); } } else { } }