//Поиск похожих слов 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); } } }
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("Необходимо выбрать файл и ввести слово для поиска"); } }
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("Необходимо выбрать файл и ввести слово для поиска"); } }
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("Выберите файл и введите слово для поиска"); } }