Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2014, 18:21   #1
maxwel6064
Пользователь
 
Регистрация: 24.03.2011
Сообщений: 28
По умолчанию Использование потоков в c#

Добрый день. Нужна ваша помощь с созданием одной программки. Основная часть у меня вроде бы есть, однако не совсем понимаю как сделать следующее:
В общем нужно создать генератор случайных чисел и во время генерации программа должна проверять является ли число первичным и фибоначчи. Программа должна работать по такому принципу: первый поток генерирует числа, второй проверяет является ли число первичным, третий поток проверяет является ли число фибоначчи, а в четвертом потоке должен быть progressbar. Первый поток должен ждать, пока второй и третий поток проверит число и только потом генерировать новое число, т.е. одно сгенерировал число, проверил и дальше генерирует.
В общем я сделал следующий код:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Threading;

namespace random_skaiciu_generatorius
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            generate();
        }

    public void generate()
        {
            int numbers = Convert.ToInt32(numericUpDown1.Value);
            int from = Convert.ToInt32(numericUpDown2.Value);
            int to = Convert.ToInt32(numericUpDown3.Value);
            int[] generatedNumbers = new int[numbers];
            int[] fibonacci = new int[numbers];
            fibonacci[0] = 1;
            fibonacci[1] = 1;
            int i=0, j=0;
            int primeNumber;
            progressBar1.Maximum = numbers;
            progressBar1.Minimum = 0;
            Random rnd = new Random();
            Stopwatch stopwatch = new Stopwatch();
           Thread thread1 = new Thread(
                   new ThreadStart(() =>
                   {
                       using (StreamWriter writer =
                           new StreamWriter("rezultatai.txt"))
                       {
                           for (i = 0; i < numbers; i++)
                           {   
                               stopwatch.Start();
                               generatedNumbers[i] = rnd.Next(from, to);
                               writer.WriteLine(generatedNumbers[i]);
                               stopwatch.Stop();
                           }
                       }
                   }));

            Thread thread2 = new Thread(
                new ThreadStart(() =>
                    {
                        for (i = from; i <= to; i++)
                        {
                            for (j = 2; j <= i; j++)
                            {
                                if (i % j == 0)
                                {
                                    break;
                                }
                            }
                            if (i == j)
                            {
                                primeNumber = i;
                                MessageBox.Show(primeNumber.ToString());
                            }
                        }
                    }
            ));
            Thread thread3 = new Thread(
                new ThreadStart(() =>
                    {
                        for (i = from; i <= to; i++)
                        {
                            fibonacci[i] = fibonacci[i - 1] + fibonacci[i - 2];
                            //MessageBox.Show(fibonacci[i].ToString());
                        }
                    }
            ));
            Thread thread4 = new Thread(
            new ThreadStart(() =>
            {
                while (i < numbers)
                {
                    progressBar1.BeginInvoke(
                        new Action(() =>
                        {
                            progressBar1.Value =i;
                        }
                        ));
                }
                
            }
            ));

            thread1.Start();
            thread4.Start();
            thread2.Start();    
            thread3.Join();
            
        }

    }
}
В общем в моем представленном коде программа уже генерирует числа, проверяет на первичность и фибоначчи. Однако вся эта проверка и генерация выполняется сразу для всех чисел. Как можно сделать, чтобы потоки выполнялись бы постепенно, т.е. одно число сгенерировала программа, проверила на первичность и фибоначчи, и только потом чтобы программа начала генерацию нового числа. Интервалы от и до я ввожу с помощью компонента numericupdown, количества чисел также. Надеюсь будет понятен мой код и вы поняли суть вопроса. Заранее большое спасибо за помощь.
maxwel6064 вне форума Ответить с цитированием
Старый 19.03.2014, 14:11   #2
TELEPUZ
Пользователь
 
Регистрация: 20.01.2014
Сообщений: 37
По умолчанию

Цитата:
Сообщение от maxwel6064 Посмотреть сообщение
Копай в сторону объектов синхронизации потоков. В частности предлагаю посмотреть в сторону событий(Event) - с автосбросом(есть ещё со сбросом вручную)
TELEPUZ вне форума Ответить с цитированием
Старый 19.03.2014, 15:35   #3
TELEPUZ
Пользователь
 
Регистрация: 20.01.2014
Сообщений: 37
По умолчанию

К сожалению код привести не могу. Я события использовал на С++. На шарпе не доводилось, но точно знаю, что в дотнете их можно использовать. В двух словах - событие - это объект синхронизации потоков. Один из потоков засыпает и ожидает, когда объект-событие даст сигнал на то, что ему можно начинать выполнять свою работу. Как только второй поток завершит свою работу, нужно выставить этот объект в сигнальное состояние - и поток,который уснул - начнёт свою работу. Событие можно установить вручную в сигнальное состояние в коде (событие со сбросом вручную), а можно использовать и событие с автосбросом.
Вот тут смотри подробнее http://msdn.microsoft.com/ru-ru/library/ms173179.aspx

Последний раз редактировалось TELEPUZ; 19.03.2014 в 15:39.
TELEPUZ вне форума Ответить с цитированием
Старый 19.03.2014, 15:52   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

ТС: попробуйте освоить и применить сию модную штуку:
http://msdn.microsoft.com/ru-ru/library/hh191443.aspx
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование классов внутри потоков frosich Общие вопросы Delphi 9 10.11.2013 16:50
Счётчик потоков bulldog5293 Общие вопросы C/C++ 6 15.05.2012 11:07
Поисковик по маске. Использование потоков в среде(tthread) Delphi. lnikon Общие вопросы Delphi 1 22.07.2010 19:31
создание потоков MaRKer.nsk Общие вопросы C/C++ 6 28.03.2010 20:59
Использование потоков Repz Общие вопросы Delphi 6 25.01.2008 14:20