Beispiel #1
0
        //Поиск похожих слов
        private void FindSimilarWords_Click(object sender, RoutedEventArgs e)
        {
            string sampleWord  = SampleWord.Text.Trim();
            int    maxDistance = Convert.ToInt32(MaxDistText.Text);
            int    ThreadCount = Convert.ToInt32(MaxThreadCountText.Text);

            if (!string.IsNullOrWhiteSpace(sampleWord) && listWords.Count > 0)
            {
                //Результирующий список
                List <string> Result = new List <string>();

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


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

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

                    tasks[i] = new Task <List <string> >(
                        //Метод, который будет выполняться в потоке
                        ArrayThreadTask,
                        //Параметры потока передаются в виде кортежа, чтобы не создавать временный класс
                        new Tuple <List <String>, string, int>(tempTaskList, sampleWord, maxDistance));
                    //Запуск потока
                    tasks[i].Start();
                }

                //Ожидание завершения всех потоков
                Task.WaitAll(tasks);

                //Объединение результатов полученных из разных потоков
                for (int i = 0; i < count; i++)
                {
                    //Добавление результатов конкретного потока в общий массив результатов
                    Result.AddRange(tasks[i].Result);
                }

                SimilarWordsBox.Items.Clear();
                foreach (string word in Result)
                {
                    SimilarWordsBox.Items.Add(word);
                }
            }
        }
Beispiel #2
0
        private void button3_Click(object sender, EventArgs e)
        {
            Console.WriteLine("asd");
            //Слово для поиска
            string word = this.textBox3.Text.Trim();

            //Если слово для поиска не пусто
            if (!string.IsNullOrWhiteSpace(word) && list.Count > 0)
            {
                int maxDist;
                if (!int.TryParse(this.textBox5.Text.Trim(), out maxDist))
                {
                    MessageBox.Show("Необходимо указать максимальное расстояние");
                    return;
                }
                if (maxDist < 1 || maxDist > 5)
                {
                    MessageBox.Show("Максимальное расстояние должно быть в диапазоне от 1 до 5");
                    return;
                }
                int ThreadCount;
                if (!int.TryParse(this.textBox7.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.textBox6.Text = timer.Elapsed.ToString();
                //Вычисленное количество потоков
                this.textBox8.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("Необходимо выбрать файл и ввести слово для поиска");
            }
        }
Beispiel #3
0
        private void button3_Click_1(object sender, EventArgs e)
        {
            string word = this.textBoxFind.Text.Trim();

            if (!string.IsNullOrWhiteSpace(word) && list.Count > 0)
            {
                int maxDist;
                if (!int.TryParse(this.textBoxThreadCountAll.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.textBoxMaxDist.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("Необходимо выбрать файл и ввести слово для поиска");
            }
        }
Beispiel #4
0
        private void ButtonCalcDistance_Click(object sender, RoutedEventArgs e)
        {
            string currentWord = TextBoxCurrentWord.Text.Trim();

            if (!string.IsNullOrWhiteSpace(currentWord) && words.Count > 0)
            {
                if (!int.TryParse(TextBoxMaxDistance.Text.Trim(), out int maxDistance))
                {
                    MessageBox.Show("Введите максимальное расстояние");
                    return;
                }
                if (maxDistance < 1 || maxDistance > 5)
                {
                    MessageBox.Show("Максимальное расстояние должно быть в диапазоне от 1 до 5");
                    return;
                }
                if (!int.TryParse(TextBoxThreadCount.Text.Trim(), out int ThreadCount))
                {
                    MessageBox.Show("Необходимо указать количество потоков");
                    return;
                }
                Stopwatch timer = new Stopwatch();
                timer.Start();
                List <ParallelSearchResult> Result = new List <ParallelSearchResult>();
                List <MinMax> arrayDivList         = SubArrays.DivideSubArrays(0, words.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 = words.GetRange(arrayDivList[i].Min, arrayDivList[i].Max - arrayDivList[i].Min);
                    tasks[i] = new Task <List <ParallelSearchResult> >(ArrayThreadTask,
                                                                       new ParallelSearchThreadParam()
                    {
                        TempList    = tempTaskList,
                        MaxDist     = maxDistance,
                        ThreadNum   = i,
                        WordPattern = currentWord
                    });
                    tasks[i].Start();
                }
                Task.WaitAll(tasks);
                timer.Stop();
                for (int i = 0; i < count; i++)
                {
                    Result.AddRange(tasks[i].Result);
                }
                timer.Stop();
                LabelTimeCalc.Content    = timer.Elapsed.ToString();
                LabelThreadCount.Content = count.ToString();
                List <string> tempList = new List <string>();
                foreach (var x in Result)
                {
                    string temp = x.Word + " (расстояние: " + x.Dist.ToString() + "; поток: " + x.ThreadNum.ToString() + ")";
                    tempList.Add(temp);
                }
                LabelTimeCalc.Content     = timer.Elapsed.ToString();
                ListBoxResult.ItemsSource = tempList;
            }
            else
            {
                MessageBox.Show("Выберите файл и введите слово для поиска");
            }
        }