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