private void Search_Click(object sender, EventArgs e)
        {
            string word = this.Field_for_input.Text.Trim();

            if (!string.IsNullOrWhiteSpace(word) && list.Count > 0)
            {
                int maxDist;
                if (!int.TryParse(this.text_dist.Text.Trim(), out maxDist))
                {
                    MessageBox.Show("Необходимо указать максимальное расстояние");
                    return;
                }

                if (maxDist < 1 || maxDist > 5)
                {
                    MessageBox.Show("Максимальное расстояние должно быть в диапазоне от 1 до 5");
                    return;
                }

                int ThreadCount;
                if (!int.TryParse(this.count_of_stream.Text.Trim(), out ThreadCount))
                {
                    MessageBox.Show("Необходимо указать количество потоков");
                    return;
                }

                Stopwatch timer = new Stopwatch();
                timer.Start();

                //Результирующий список
                List <ParallelSearchResult> Result = new List <ParallelSearchResult>();

                //Деление списка на фрагменты для параллельного запуска в потоках
                List <MinMax> arrayDivList = SubArrays.DivideSubArrays(0, list.Count, ThreadCount);
                int           count        = arrayDivList.Count;

                //Количество потоков соответствует количеству фрагментов массива
                Task <List <ParallelSearchResult> >[] tasks = new Task <List <ParallelSearchResult> > [count];

                //Запуск потоков
                for (int i = 0; i < count; i++)
                {
                    //Создание временного списка, чтобы потоки не работали параллельно с одной коллекцией
                    List <string> tempTaskList = list.GetRange(arrayDivList[i].Min, arrayDivList[i].Max - arrayDivList[i].Min);

                    tasks[i] = new Task <List <ParallelSearchResult> >(
                        //Метод, который будет выполняться в потоке
                        ArrayThreadTask,
                        //Параметры потока
                        new ParallelSearchThreadParam()
                    {
                        tempList    = tempTaskList,
                        maxDist     = maxDist,
                        ThreadNum   = i,
                        wordPattern = word
                    });

                    //Запуск потока
                    tasks[i].Start();
                }
                Task.WaitAll(tasks);

                timer.Stop();

                //Объединение результатов
                for (int i = 0; i < count; i++)
                {
                    Result.AddRange(tasks[i].Result);
                }

                //timer.Stop();

                //Время поиска
                this.Time_of_searching.Text = timer.Elapsed.ToString();

                //Вычисленное количество потоков
                this.label_count_of_steam.Text = count.ToString();

                //Обновление списка результатов
                this.Result_list.BeginUpdate();
                this.Result_list.Items.Clear();
                foreach (var x in Result)
                {
                    string temp = x.word + "(расстояние=" + x.dist.ToString() + " поток=" + x.ThreadNum.ToString() + ")";
                    this.Result_list.Items.Add(temp);
                }
                this.Result_list.EndUpdate();
            }
            else
            {
                MessageBox.Show("Необходимо выбрать файл и ввести слово для поиска");
            }
        }
Exemple #2
0
        private void button2_Click(object sender, EventArgs e)
        {
            Stopwatch     extime    = new Stopwatch();
            string        new_str   = "\0";
            Random        rnd       = new Random();
            string        word_temp = textBox3.Text.Trim();
            List <string> tempList  = new List <string>();

            if (string.IsNullOrWhiteSpace(word_temp))
            {
                MessageBox.Show("Пожалуйста, введите слово для поиска!");
            }
            if (radioButton1.Checked == true)
            {
                extime.Start();
                for (int i = 0; i < word_list.Count; i++)
                {
                    if (word_list[i].ToUpper().Contains(word_temp.ToUpper()) && !listBox1.Items.Contains(word_list[i]))
                    {
                        new_str = word_list[i];
                        tempList.Add(new_str);
                    }
                }
            }
            else if (radioButton2.Checked == true)
            {
                if (!int.TryParse(textBox6.Text, out int thread_count))
                {
                    MessageBox.Show("Пожалуйста, введите количество потоков!");
                    return;
                }
                if (!int.TryParse(textBox5.Text, out int max_dist))
                {
                    MessageBox.Show("Пожалуйста, введите максимальное редакционное расстояние!");
                    return;
                }
                extime.Start();
                List <ParallelSearchResult> result_list = new List <ParallelSearchResult>();
                List <MinMax> div_list = SubArrays.DivideSubArrays(0, word_list.Count, thread_count);
                int           countSub = div_list.Count;
                Task <List <ParallelSearchResult> >[] tasks = new Task <List <ParallelSearchResult> > [countSub];
                for (int i = 0; i < countSub; i++)
                {
                    List <string> tempTaskList = word_list.GetRange(div_list[i].min, div_list[i].max - div_list[i].min);
                    tasks[i] = new Task <List <ParallelSearchResult> >(
                        ArrayThreadTask,
                        new ParallelSearchThreadParam()
                    {
                        searchList = tempTaskList,
                        maxDist    = max_dist,
                        threadNum  = i,
                        wordTemp   = word_temp
                    });
                    tasks[i].Start();
                }
                Task.WaitAll();
                extime.Stop();
                for (int i = 0; i < countSub; i++)
                {
                    result_list.AddRange(tasks[i].Result);
                }
                label8.Text    = "Вычисленное количество потоков: " + countSub.ToString();
                label8.Visible = true;
                listBox1.BeginUpdate();
                listBox1.Items.Clear();
                for (int i = 0; i < result_list.Count; i++)
                {
                    listBox1.Items.Add(result_list[i].word + " [расстояние = " +
                                       result_list[i].dist.ToString() + " | поток = " + result_list[i].threadNum.ToString() + "]");
                }
                listBox1.EndUpdate();
            }
            else
            {
                MessageBox.Show("Пожалуйста, выберите метод поиска слова!");
            }
            if (tempList.Count > 0)
            {
                listBox1.BeginUpdate();
                foreach (string str in tempList)
                {
                    listBox1.Items.Add(str);
                }
                listBox1.EndUpdate();
            }
            extime.Stop();
            textBox4.Text = extime.Elapsed.ToString();
        }
Exemple #3
0
        private void button3_Click(object sender, EventArgs e)

        {
            string word = this.textBox4.Text.Trim();

            this.listBox1.BeginUpdate();
            this.listBox1.Items.Clear();
            if (!string.IsNullOrWhiteSpace(word) && list.Count > 0)
            {
                int maxDist;
                if (!int.TryParse(this.textBox7.Text.Trim(), out maxDist))
                {
                    MessageBox.Show("Необходимо указать максимальное расстояние");
                    return;
                }
                if (maxDist < 1 || maxDist > 5)
                {
                    MessageBox.Show("Максимальное расстояние должно быть в диапазоне от 1 до 5");
                    return;
                }
                int ThreadCount;
                if (!int.TryParse(this.textBox8.Text.Trim(), out ThreadCount))
                {
                    MessageBox.Show("Необходимо указать количество потоков");
                    return;
                }
                Stopwatch timer = new Stopwatch();
                timer.Start();
                List <ParallelSearchResult> Result = new List <ParallelSearchResult>();
                List <MinMax> arrayDivList         = SubArrays.DivideSubArrays(0, list.Count, ThreadCount);
                int           count = arrayDivList.Count;
                Task <List <ParallelSearchResult> >[] tasks = new Task <List <ParallelSearchResult> > [count];
                for (int i = 0; i < count; i++)
                {
                    List <string> tempTaskList = list.GetRange(arrayDivList[i].Min, arrayDivList[i].Max - arrayDivList[i].Min);
                    tasks[i] = new Task <List <ParallelSearchResult> >(
                        ArrayThreadTask,
                        new ParallelSearchThreadParam()
                    {
                        tempList    = tempTaskList,
                        maxDist     = maxDist,
                        ThreadNum   = i,
                        wordPattern = word
                    });
                    tasks[i].Start();
                }
                Task.WaitAll(tasks);
                timer.Stop();
                for (int i = 0; i < count; i++)
                {
                    Result.AddRange(tasks[i].Result);
                }
                timer.Stop();
                this.textBox5.Text = timer.Elapsed.ToString();
                this.textBox6.Text = count.ToString();
                foreach (var x in Result)
                {
                    string temp = x.word + "(расстояние=" + x.dist.ToString() + " поток=" + x.ThreadNum.ToString() + ")";
                    this.listBox1.Items.Add(temp);
                }
                this.listBox1.EndUpdate();
            }
            else
            {
                MessageBox.Show("Необходимо выбрать файл и ввести слово для поиска");
            }
        }