Пример #1
0
        private void button3_Click(object sender, EventArgs e)
        {
            string right_word = textBox2.Text;

            if (!string.IsNullOrWhiteSpace(right_word))
            {
                int max_dist;
                if (!int.TryParse(this.textBox4.Text, out max_dist))
                {
                    MessageBox.Show("Необходимо указать максимальное расстояние");
                    return;
                }
                if (max_dist < 1 || max_dist > 5)
                {
                    MessageBox.Show("Максимальное расстояние должно быть в диапазоне от 1 до 5");
                    return;
                }
                int thread_count;
                if (!int.TryParse(this.textBox5.Text, out thread_count))
                {
                    MessageBox.Show("Необходимо указать количество потоков");
                    return;
                }

                Stopwatch t = new Stopwatch();

                t.Start();
                List <ParallelSearchResult> Result = new List <ParallelSearchResult>();
                List <MinMax> arrayDivList         = SubArrays.DivideSubArrays(0, words.Count, thread_count);
                int           count = arrayDivList.Count;

                Task <List <ParallelSearchResult> >[] tasks = new Task <List <ParallelSearchResult> > [count];

                for (int i = 0; i < count; i++)
                {
                    List <string> tempTaskList = words.GetRange(arrayDivList[i].Min,
                                                                arrayDivList[i].Max - arrayDivList[i].Min);

                    tasks[i] = new Task <List <ParallelSearchResult> >(
                        ArrayThreadTask,
                        new ParallelSearchThreadParam()
                    {
                        tempList    = tempTaskList,
                        maxDist     = max_dist,
                        ThreadNum   = i,
                        wordPattern = right_word
                    });
                    tasks[i].Start();
                }
                Task.WaitAll(tasks);
                t.Stop();
                for (int i = 0; i < count; i++)
                {
                    Result.AddRange(tasks[i].Result);
                }
                t.Stop();

                this.textBox7.Text = t.Elapsed.ToString();

                this.textBox6.Text = count.ToString();
                this.listBox1.BeginUpdate();
                this.listBox1.Items.Clear();

                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("Необходимо выбрать файл и ввести слово для поиска");
            }
        }
Пример #2
0
        private void buttonApprox_Click(object sender, EventArgs e)
        {
            string word = this.textBoxFind.Text.Trim(); //Слово для поиска


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

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

                int ThreadCount;
                if (!int.TryParse(this.textBoxThreadCount.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.textBoxApproxTime.Text = timer.Elapsed.ToString();

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

                //Начало обновления списка результатов
                this.listBoxResult.BeginUpdate();

                //Очистка списка
                this.listBoxResult.Items.Clear();

                //Вывод результатов поиска
                foreach (var x in Result)
                {
                    string temp = x.word + "(расстояние=" + x.dist.ToString() + " поток=" + x.ThreadNum.ToString() + ")";
                    this.listBoxResult.Items.Add(temp);
                }

                //Окончание обновления списка результатов
                this.listBoxResult.EndUpdate();
            }
            else
            {
                MessageBox.Show("Необходимо выбрать файл и ввести слово для поиска");
            }
        }