Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Windows.Forms;
- using System.Diagnostics;
- namespace MonteCarloPi
- {
- public partial class Form1 : Form
- {
- private Int64 losowania;
- private int threadNr;
- private int howManyThreads;
- public Stopwatch timer;
- private double[,] results;
- private int processors;
- public Form1()
- {
- InitializeComponent();
- }
- private void calculateBtn_Click(object sender, EventArgs e)
- {
- this.losowania = Convert.ToInt64(losowaniaBox.Text);
- this.threadNr = Convert.ToInt16(resultBox.Text);
- this.howManyThreads = threadNr;
- Random r = new Random();
- this.results = new double[threadNr, 3];
- calculateBtn.Enabled = false;
- this.timer = Stopwatch.StartNew();
- progressBar1.Value = 0;
- textBox3.AppendText("Uruchomiono program.\n");
- for (int i = 0; i < threadNr; i++)
- {
- BackgroundWorker m_oBackgroundWorker = new BackgroundWorker();
- m_oBackgroundWorker.DoWork += new DoWorkEventHandler(m_oBackGroundWorker_DoWork);
- m_oBackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oBackGroundWorker_RunWorkerCompleted);
- // m_oBackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(m_oBackGroundWorker_ProgressChanged);
- // m_oBackgroundWorker.WorkerReportsProgress = true;
- int[] parameters = new int[2];
- parameters[0] = i;
- parameters[1] = r.Next();
- m_oBackgroundWorker.RunWorkerAsync(parameters);
- }
- }
- private void m_oBackGroundWorker_DoWork(object sender, DoWorkEventArgs e)
- {
- BackgroundWorker m_oBackGroundWorker = sender as BackgroundWorker;
- int[] parameters = (int[])e.Argument;
- int indeks = parameters[0];
- long trafienie = 0;
- long losowaniaWatek = losowania/threadNr;
- Random rand = new Random(parameters[1]);
- for (int i = 1; i < losowaniaWatek; i++)
- {
- if (Math.Pow(rand.NextDouble(), 2) + Math.Pow(rand.NextDouble(), 2) <= 1)
- {
- trafienie++;
- }
- }
- this.results[indeks, 0] = trafienie;
- this.results[indeks, 1] = 4.0 * trafienie / losowaniaWatek;
- //double bezwzgledna = Math.Abs(Math.PI - aproksymacja);
- processors = Environment.ProcessorCount;
- // for (int nCounter = 1; nCounter <= 100; nCounter += 1)
- // {
- // Thread.Sleep(1000);
- // m_oBackGroundWorker.ReportProgress(nCounter, results);
- // }
- }
- /* void m_oBackGroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
- {
- if (0 == (e.ProgressPercentage % 5))
- {
- textBox3.AppendText(e.ProgressPercentage.ToString() + "\n");
- }
- progressBar1.Value = e.ProgressPercentage;
- */
- private void m_oBackGroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
- {
- if (Interlocked.Decrement(ref howManyThreads) == 0)
- {
- timer.Stop();
- double sum = 0;
- for (int i = 0; i < results.GetLength(0);i++)
- {
- sum += results[i, 1];
- }
- double aproksymacja = (sum / results.GetLength(0));
- textBox3.Text = "Aproksymacja " + aproksymacja + "\n";
- double time = timer.Elapsed.TotalSeconds;
- textBox3.AppendText("Czas obliczeń " + time.ToString() + "\n");
- textBox3.AppendText("Bezwzględna " + Math.Abs(Math.PI - aproksymacja) + "\n");
- textBox3.AppendText("Ilość procesorów " + processors);
- calculateBtn.Enabled = true;
- }
- }
- //metody do guzików i textboxow
- private void losowaniaBox_TextChanged(object sender, EventArgs e)
- {
- }
- private void resultBox_TextChanged(object sender, EventArgs e)
- {
- }
- private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
- {
- }
- private void textBox1_TextChanged(object sender, EventArgs e)
- {
- }
- private void textBox2_TextChanged(object sender, EventArgs e)
- {
- }
- private void textBox3_TextChanged(object sender, EventArgs e)
- {
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement