예제 #1
0
        private void StartMonteCarloSimulationClicked(object sender, EventArgs e)
        {
            if (!workerAutoThrow.IsBusy || m_Workers != null)
            {
                EnableUI(false);
                int nThreads = (int)numericUpDownNThreads.Value;
                m_Workers = new BackgroundWorker[nThreads];

                var rand = new Random();
                m_WorkersOutput = new MonteCarloSimResult();
                m_WorkersOutput.iThread = 0;

                for (int iThread = 0; iThread < nThreads; iThread++)
                {
                    m_Workers[iThread] = new BackgroundWorker();
                    m_Workers[iThread].WorkerReportsProgress = true;
                    m_Workers[iThread].WorkerSupportsCancellation = true;
                    m_Workers[iThread].DoWork += new DoWorkEventHandler(MonteCarloSim_DoWork);
                    m_Workers[iThread].ProgressChanged += new ProgressChangedEventHandler(MonteCarloSim_ProgressChanged);
                    m_Workers[iThread].RunWorkerCompleted += new RunWorkerCompletedEventHandler(MonteCarloSim_RunWorkerCompleted);

                    MonteCarloSimArgs args = new MonteCarloSimArgs();

                    args.nGames = (int)numericUpDownNGames.Value / nThreads;
                    args.nPlayers = (int)numericUpDownNPlayers.Value;
                    args.iSeed = rand.Next();
                    args.bShuffleWinnings = checkBoxShuffleResult.Checked;
                    args.nThreads = nThreads;
                    args.iThread = iThread;

                    m_Workers[iThread].RunWorkerAsync(args);
                }
            }
            else MessageBox.Show("Simulation is already running!"); // should be an assert... because we should never be here.
        }
예제 #2
0
        private void MonteCarloSimUpdateProgress(BackgroundWorker bw, MonteCarloSimResult bwo, int iRun, MonteCarloSimArgs args)
        {
            MonteCarloSimState update = new MonteCarloSimState();
            update.nRuns = bwo.nRuns;
            update.iThread = args.iThread;
            update.nTotalThrows = Sum(bwo.nThrowsList);
            update.nInfinateLoops = bwo.nInfiniteLoops;
            update.nTotalWars = Sum(bwo.nTotalWarsList);
            update.nTotalTies = Sum(bwo.nTiesList);
            update.nTotalSingleWars = Sum(bwo.nSingleWarsList);
            update.nTotalDoubleWars = Sum(bwo.nDoubleWarsList);
            update.nTotalTripleWars = Sum(bwo.nTripleWarsList);
            update.nTotalQuadWars = Sum(bwo.nQuadWarsList);
            update.nTotalFiveWars = Sum(bwo.nFiveWarsList);
            update.nTotalSixWars = Sum(bwo.nSixWarsList);
            update.nTotalSevenWars = Sum(bwo.nSevenWarsList);

            bw.ReportProgress((int)(100.0 * iRun / (double)args.nGames), update);
        }