Пример #1
0
        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();
        }
Пример #2
0
        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("Введите слово или количество потоков или максимально расстояние");
            }
        }
Пример #3
0
        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("Необходимо выбрать файл и ввести слово для поиска");
            }
        }
Пример #4
0
        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("Необходимо выбрать файл и ввести слово для поиска");
            }
        }
Пример #5
0
        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("Необходимо выбрать файл и ввести слово для поиска");
            }
        }