Пытаюсь реализовать мнопоточный расчет интеграла методами левых прямоугольников и трапеций. Но при увеличении кол-ва потоков время работы программы уменьшается примерно на 4-5к мс, что несущественно. Переменная check нужна для определения каким методом считать интеграл. Каждому потоку передает значение number и прогоняю цикл от number до i += кол-во потоков, конфликт потоков возникать не должен.
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.Windows.Forms;
using System.Diagnostics;
using System.Threading;
namespace PotokIntegral
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
static int check = 0;
static double bi = 0;
static double biMetod = 0;
static double xi = 0;
static double a = 0;
static double b = 2;
static double N = 0;
static double h = 0;
static double F = 0;
static double Fpred = 0;
static double Fb = 0.5 * Math.Atan(2 / 2);
static double Fa = 0;
static double[] sum1 = new double [100];
static double[] sum2 = new double [100];
static double sumItog = 0;
static double metodPr = 0;
static double metodTrap = 0;
static double Fitog = Fb - Fa;
static int numberPotoks = 0;
private void button1_Click(object sender, EventArgs e)
{
sumItog = 0; bi = 0; xi = 0;
Array.Clear(sum1, 0, 100);
Array.Clear(sum2, 0, 100);
if (radioButton1.Checked == true)
{
check = 1;
}
else
{
check = 2;
}
N = int.Parse(numericUpDown1.Value.ToString()); //число разбиений
numberPotoks = int.Parse(numericUpDown2.Value.ToString()); //число потоков
h = (b - a) / N;
Thread[] th = new Thread[numberPotoks];
Stopwatch s = new Stopwatch();
s.Start();
for (int i = 0; i < numberPotoks; i++)
{
th[i] = new Thread(method);
th[i].Start(i);
}
for (int i = 0; i < numberPotoks; i++)
{
th[i].Join();
}
s.Stop();
if (check == 1)
for (int i = 0; i < numberPotoks; i++)
{
sumItog += sum1[i];
}
if (check == 2)
for (int i = 0; i < numberPotoks; i++)
{
sumItog += sum2[i];
}
richTextBox1.Text += "Кол-во потоков: "+numberPotoks.ToString()+" Значение интеграла: " + Math.Round(sumItog, 5).ToString() +
" Время работы потоков: " + s.ElapsedMilliseconds.ToString() + "\r\n";
}
private void method(object number)
{
if (check == 1)
{
for (int i = (int)number; i < N; i += numberPotoks)
{
Fpred = 1 / (xi*xi + 4);
sum1[(int)number] += Fpred * h;
xi += h;
}
}
else if (check == 2)
{
for (int i = (int)number; i < N; i += numberPotoks)
{
biMetod = xi + h;
Fpred = 1 / (xi*xi + 4);
F = 1 / (biMetod*biMetod + 4);
metodTrap = ((Fpred + F) / 2) * h;
sum2[(int)number] += metodTrap;
bi = xi + h;
xi = bi;
}
}
}
}
}
В чем может быть проблема?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Первый раз использую ком обьектыПодскажите пожалуйста, я зарегистрировал ком объект, теперь хочу проверить его работоспособность, методом...
Некоторые сайты не открываются с помощью контрола webbrowserПроверил версию webbrowser свойством version, версия полностью совпадает с установленным...
Добрый день, у меня возник маленький вопрос, можно ли использовать «Пакет кодеков для камер Microsoft» для отображения raw файлов в ListView в C#? и как?