Wielowątkowy program do liczenia PI metodą Monte Carlo

0

Witam, potrzebuję pomocy z programem liczącym PI metodą Monte Carlo, program działa i wszystko jest w porządku na jednym wątku, jednak ma działać na wielu wątkach.
Gdyby ktoś mógł mi pomóc i powiedzieć jak to wygląda i co trzeba zmienić to byłbym wdzięczny. Program powinien przyjmować ilość wątków od użytkownika z textboxa.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.Diagnostics;

namespace MonteCarloPi
{
    public partial class Form1 : Form
    {
        

        public Form1()
        {
            InitializeComponent();
        }

        // Po kliknięciu w guzik Policz, zostaje obliczone PI metodą Monte Carlo
        // Opis działania guzika

        private void calculateBtn_Click(object sender, EventArgs e)
        {
            int procesory = 0;
            Int64 n = Int64.Parse(losowaniaBox.Text);
            int thread = int.Parse(thread_nr.Text);

            int trafienie = 0;
            Random r = new Random();

            Stopwatch stopWatch1 = Stopwatch.StartNew();
            for (int i = 0; i < n; i++)
            {
                if (Math.Pow(r.NextDouble(), 2) + Math.Pow(r.NextDouble(), 2) <= 1)
                {
                    trafienie++;
                }
            }
            
            double aproksymacja = 4.0 * trafienie / n;
            double bezwzgledna = Math.Abs(Math.PI - aproksymacja);

            stopWatch1.Stop();
            thread_time.Text = stopWatch1.Elapsed.TotalSeconds.ToString();

            //wypisywanie do poszczególnych textboxów

            resultBox.Text = trafienie.ToString();
            aproksymacjaBox.Text = aproksymacja.ToString();
            errorBox.Text = bezwzgledna.ToString();

            procesory = Environment.ProcessorCount;
            processor_nr.Text = procesory.ToString();

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MonteCarloPi
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

        }
    }
}

Pozdrawiam i z góry dziękuję za pomoc

0

Spróbuj utworzyć dodatkowe wątki z pomocą klasy Task
http://msdn.microsoft.com/en-us/library/dd321424%28v=vs.110%29.aspx

Odnośnie samej implementacji nie bardzo wiem jak powinno to wyglądać, lecz chyba jesteś w stanie sobie to zobrazować za pomocą tych informacji
http://pl.wikipedia.org/wiki/Metoda_Monte_Carlo#Przyk.C5.82ad_obliczania_liczby_pi_metod.C4.85_Monte_Carlo_w_j.C4.99zyku_C.2B.2B

Do utworzenia wielu wątków możesz także wykorzystać listę, lecz to jest raczej kiepski pomysł. Zależnie jak Ci się uda to zrealizować możesz użyć Task, lub Thread

List<Thread> watki = new List<Thread>();
    
    public void DodajWatek()
    {
        Thread watek = new Thread(() => { FunkcjaWatku(); });
        watki.Add(watek);
    }

    private void FunkcjaWatku()
    {
        // cokolwiek
    }

    private void UruchomWatki()
    {
        foreach (Thread watek in watki)
            watek.Start();
    }
0

Udało mi się dodać wątki Thread

List<Thread> threads = new List<Thread>();
 for(int i = 0; i < threadNr ; i++)
{
    Thread oThread = new Thread(() => { getPI(sData); });
    threads.Add(oThread);
}

foreach (Thread thread in threads)
{
    thread.Start();
}

Jednak teraz borykam się z innym problemem. Jak widać w pierwszym poście na końcu metoda getPi wypisuje wyliczone wartości do textboxów. Jednak jako, że teraz to wątek odpala tą metodę kompilator wyrzuca błąd InvalidOperationException ponieważ GUI znajduje się na innym wątku i metoda nie może do niego uzyskać dostępu.

dodanie znacznika <code class="csharp"> - @furious programming

0
Anteros napisał(a):

Jednak teraz borykam się z innym problemem. Jak widać w pierwszym poście na końcu metoda getPi wypisuje wyliczone wartości do textboxów. Jednak jako, że teraz to wątek odpala tą metodę kompilator wyrzuca błąd InvalidOperationException ponieważ GUI znajduje się na innym wątku i metoda nie może do niego uzyskać dostępu.

http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c

Popraw mnie ktoś jeśli powinien być to komentarz do postu, czy oddzielny post - dawno mnie tu nie było i nie wiem czy regulamin uległ zmianie

0

A nie lepiej i prościej, użyć Pararell.For ?

0

Poradziłem sobie używając backgroundworkera, trzeba było z tym trochę pokombinować ale działa koniec końców :)
Dzieki za pomoc :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1