Распараллеливанием выражения - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. У меня есть программа, которая считает интеграл двумя способами: методом Левых прямоугольников и методом Трапеций. И нужно ее дополнить следующим образом: добавить возможность выбирать количество потоков для решения. Количество потоков от 1 до 10. Например, выбрали 1 поток. Создается 1 дополнительный поток и в нем просчитываются значения выражение двумя, затем в основном потоке значение выводится в textBox, в зависимости от выбранного флажка в RadioButton. И у меня возникают трудности с 2 и более потоками. Как это можно реализовать? Я пробовал сделать для 2 потоков, но вышло очень громоздко, да и считало как-то неверно. Код для одного потока.
{
Stopwatch Time = new Stopwatch();
            Time.Reset();
            Time.Start();
            int A = 1;
            int B = 3;
            double N = Convert.ToDouble(numericUpDown1.Value);
            double h = 2/N;
            double x = 1;
            double z1 = 0;
            double z2 = 0;
            double proverka = Math.Round((double)-1/(double)(2*B)+0.25*(Math.Log((double)(B+2)/(double)B))-(((double)-1/(double)(2*A)+0.25*Math.Log((double)(A+2)/(double)A))),4);
                for (int i = 1; i <= N; i++)
                {
                    x += h;
                    double y = Math.Round((1 / (x * x * (x + 2))), 4);
                    double s1 = Math.Round((y * h), 4);
                    double s2 = Math.Round(((1 / (x * x * (x + 2)) + (1 / ((x - h) * (x - h) * (x - h + 2)))) / 2 * h), 4);
                    // dataGridView1.Rows.Add(i, x, y, s1, s2);
                    z1 += s1;
                    z2 += s2;
 
                }
 
                if (radioButton1.Checked)
                {
                    label6.Text = z1.ToString();
                    label5.Text = Math.Round((z1 - proverka),4).ToString();
                }
                if (radioButton2.Checked)
                {
                    label6.Text = z2.ToString();
                    label5.Text = Math.Round((z2 - proverka),4).ToString();
                }
                
                Time.Stop();
                //double time = Time.ElapsedTicks*((long)1/Stopwatch.Frequency);
                label7.Text = (Time.ElapsedMilliseconds).ToString() + " мс";
            }

Решение задачи: «Распараллеливанием выражения»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Forms;
 
namespace WindowsFormsApplication370
{
    public partial class Form1 : Form
    {
        double result = 0;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            //число потоков
            var threadCount = 10;
 
            //число итераций
            var N = 10000000;
 
            //число итераций для каждого потока
            var step = N / threadCount;
 
            //список потоков
            var threads = new List<Thread>();
 
            //создаем потоки и запускаем их
            for (var i = 0; i < N; i += step)
            {
                var thread = new Thread(Calc);
                threads.Add(thread);
                thread.Start(new Tuple<int, int>(i, Math.Min(i + step, N)));
            }
 
            //ожидаем завершения всех потоков
            foreach (var t in threads)
                t.Join();
 
            //выводим результат
            textBox1.Text = result.ToString();
        }
 
        private void Calc(object param)
        {
            var bounds = (Tuple<int, int>)param;
            var sum = 0d;
 
            //считаем свою часть интеграла в интервале от bounds.Item1 до bounds.Item2
            for (int i = bounds.Item1; i < bounds.Item2; i++)
            {
                //...
                //sum += ...
            }
 
            //добавляем свою сумму к общей сумме
            lock (this)
                result += sum;
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы