private void button_Search_Lev_Click(object sender, EventArgs e) { string tempstr = search_box.Text; int max, threadnum; if (List.Count == 0 || !Int32.TryParse(Lev_max.Text, out max) || !Int32.TryParse(threads.Text, out threadnum)) { MessageBox.Show("Read file first or wrong MaxValue or wrong amount of threads"); return; } Stopwatch time = new Stopwatch(); time.Start(); List <SearchResults> result = new List <SearchResults>(); List <MinMax> arrayDivList = SubArrays.DivideSubArrays(0, List.Count, threadnum); Task <List <SearchResults> >[] tasks = new Task <List <SearchResults> > [arrayDivList.Count]; for (int i = 0; i < arrayDivList.Count; i++) { List <string> tmpTaskList = List.GetRange(arrayDivList[i].Min, arrayDivList[i].Max - arrayDivList[i].Min); tasks[i] = new Task <List <SearchResults> >(ArrayThreadTask, new ThreadParameters() { tList = tmpTaskList, levMax = max, threadNumber = i, searchWord = tempstr }); tasks[i].Start(); } Task.WaitAll(tasks); time.Stop(); for (int i = 0; i < arrayDivList.Count; i++) { result.AddRange(tasks[i].Result); } time.Stop(); listBox_res.BeginUpdate(); listBox_res.Items.Clear(); foreach (var i in result) { string temp = i.word + "(расстояние=" + i.distance.ToString() + " поток=" + i.threadCount.ToString() + ")"; this.listBox_res.Items.Add(temp); } this.textBox_time_calc.Text = "Took " + time.ElapsedMilliseconds.ToString() + " ms to calculate"; listBox_res.EndUpdate(); }
private void findLevenDistanceButton_Click(object sender, EventArgs e) { List <string> currentList = new List <string>(); int maxDistance; int threadCount; string word = findWordTextBox.Text.Trim(); if ((int.TryParse(maxDistanceTextBox.Text, out maxDistance)) && (int.TryParse(threadNumberTextBox.Text, out threadCount)) && (!string.IsNullOrWhiteSpace(word))) { var findTime = new Stopwatch(); findTime.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 = maxDistance, ThreadNum = i, wordPattern = word }); tasks[i].Start(); } Task.WaitAll(tasks); for (int i = 0; i < count; i++) { Result.AddRange(tasks[i].Result); } listBox1.BeginUpdate(); listBox1.Items.Clear(); foreach (var x in Result) { string temp = x.word + "(расстояние=" + x.dist.ToString() + " поток=" + x.ThreadNum.ToString() + ")"; listBox1.Items.Add(temp); } listBox1.EndUpdate(); findTime.Stop(); findLevenDistanceTimeLabel.Text = findTime.Elapsed.TotalMilliseconds.ToString(); numberOfThreadLabel.Text = count.ToString(); } else { MessageBox.Show("Введите слово или количество потоков или максимально расстояние"); } }
private void button2_Click_2(object sender, EventArgs e) { 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.textBox6.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.textBox7.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 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 buttonNechetFind_Click(object sender, EventArgs e) //Нечеткий Поиск { textBox3.Text = ""; string word = this.textBoxFind.Text.Trim(); if (!string.IsNullOrWhiteSpace(word) && list.Count > 0) { int maxDist; if (!int.TryParse(this.textBoxMaxDistanceNechet.Text.Trim(), out maxDist)) { MessageBox.Show("Необходимо указать максимальное расстояние"); return; } if (maxDist < 1 || maxDist > 5) { MessageBox.Show("Максимальное расстояние должно быть в диапазоне от 1 до 5"); return; } int ThreadCount; if (!int.TryParse(this.textBoxNumberOfPotoks1.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.textBoxTimeNechetFind.Text = timer.Elapsed.ToString(); this.textBoxNumberOfPotoks2.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("Необходимо выбрать файл и ввести слово для поиска"); } }