private void workerLoop() { bool quitter = false; while (!quitter) { //Try to dequeue a command if (mWorkerQueues[mWorkerThreads.IndexOf(Thread.CurrentThread)].TryDequeue(out DivisionWinnerCalculatorCommand command)) { switch (command.CommandType) { case DivisionWinnerCalculatorCommandType.Judge: { DivisionResult result = JudgeSync(mGames, mDivision, mTeamIds, command.WinnerIds, command.TeamResults); mJudgmentCallback(result.WinnerId, result.DivisionFinalistIds, result.Milliseconds, command.WinnerIds); break; } case DivisionWinnerCalculatorCommandType.Finish: quitter = true; break; default: throw new Exception("Not ready for this case"); } } else { Thread.Sleep(1); } } }
private void PermutationReady(GameList allGames, List <int> allWinners, List <TeamResult> teamResults, int completedPermutations, double totalPermutations) { TotalCalculations = totalPermutations; mUpdateCounter++; if (mUpdateCounter > totalPermutations / 100) { Console.WriteLine($"{(int)Math.Round(completedPermutations / totalPermutations * 100)}% done permuting"); mUpdateCounter = 0; } //Check for final callback (signaled by homeWinners == null) if (allWinners == null) { //Wait for the judge to catch up if (mJudge != null) { mJudge.FinishSession((a, b) => { Finish(mFinishedCallback); }); } else { Finish(mFinishedCallback); } return; } if (mJudge != null) { //Throttle so we don't overload the judge while (mJudge.Backlog > 1000000) { Thread.Sleep(TimeSpan.FromMilliseconds(100)); } //Determine who won the permutation (async) mJudge.Judge(allWinners, teamResults); } else { DivisionResult result = DivisionWinnerCalculator.JudgeSync(mGames, mDivision, TeamIds, allWinners, teamResults); JudgmentReady(result.WinnerId, result.DivisionFinalistIds, result.Milliseconds, allWinners); } }