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);
                }
            }
        }
Пример #2
0
        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);
            }
        }