Распараллеливанием выражения - 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; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д