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. }
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); }