private void button2_Click(object sender, EventArgs e) { string word = this.textBox3.Text.Trim(); 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.textBox5.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.textBox4.Text = timer.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("Необходимо выбрать файл и ввести слово для поиска"); } }
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("Необходимо выбрать файл и ввести слово для поиска"); } }