Многопоточный расчет интеграла

173
07 апреля 2018, 19:27

Пытаюсь реализовать мнопоточный расчет интеграла методами левых прямоугольников и трапеций. Но при увеличении кол-ва потоков время работы программы уменьшается примерно на 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;
                }
            }
        }
    }
}

В чем может быть проблема?

READ ALSO
C# и COM обьект

C# и COM обьект

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

122
WebBrowser не открывает некоторые сайты

WebBrowser не открывает некоторые сайты

Некоторые сайты не открываются с помощью контрола webbrowserПроверил версию webbrowser свойством version, версия полностью совпадает с установленным...

149
Отображение raw файлов

Отображение raw файлов

Добрый день, у меня возник маленький вопрос, можно ли использовать «Пакет кодеков для камер Microsoft» для отображения raw файлов в ListView в C#? и как?

143