Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача по потокам через что это можно реализовать, C# 
:(
    Опции темы
compaq
Дата 4.10.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 20.11.2006

Репутация: нет
Всего: нет



Всем привет.
В общем, задача такая запустить 4 потока, причем 3 из них должны обращаться в произвольном порядке к четвёртому.  Допустим, что 3 потока это функции, а четвёртый это генератор случайных чисел и когда какой либо функции понадобится число, то она обращается к четвёртому потоку за числами. И ещё первые 3 потока должны проверять, не занят ли четвёртый и если занят то подождать какое-то время и снова его запросить, то есть должно быть что-то на подобии семафора в ОС. Вопрос как можно вызвать четвёртый поток из кода тех трёх и каким образом можно реализовать семафор.
PM MAIL   Вверх
marcusmae
Дата 4.10.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: 5
Всего: 39



Привет, compaq,

в пространстве имён System.Threading есть класс Semaphore (если у тебя 2005ая студия). Там даже есть пример кода структурно напоминающий твою задачу. Только начинить Worker-а своим кодом. Возможно, стоило бы попробовать с ним поиграться и, если возникнут вопросы, спросить здесь  smile

Это сообщение отредактировал(а) marcusmae - 4.10.2007, 23:32


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
archeg
Дата 5.10.2007, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

Репутация: 4
Всего: 27



Если я правильно понял, тебе нужны классы AutoResetEvent и ManualResetEvent. Накатал пример:
Код

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            RandomNumberGenerator gen = new RandomNumberGenerator();

            ThreadStart ts = 
            delegate
            {
                int a = 0;
                while (true)
                {
                    Console.WriteLine(Thread.CurrentThread.Name+":"+a.ToString()+":"+gen.RandomNumber.ToString());
                    a++;
                }
            };
            Thread th1 = new Thread(ts);
            th1.Name = "Thread 1";
            Thread th2 = new Thread(ts);
            th2.Name = "Thread 2";
            Thread th3 = new Thread(ts);
            th3.Name = "Thread 3";

            th1.Start();
            th2.Start();
            th3.Start();


            
        }
    }
    class RandomNumberGenerator
    {
        private Random _generator = new Random();
        private int _randomNumber;
        private AutoResetEvent querryEvent = new AutoResetEvent(false);
        private AutoResetEvent jobDone = new AutoResetEvent(false);

        public int RandomNumber
        {
            get
            {
                lock (_generator)
                {
                    // Посылаем запрос на исполнение работы
                    querryEvent.Set();
                    // Ждем пока не прийдет результат
                    jobDone.WaitOne();
                    return _randomNumber;
                }
            }
        }

        public RandomNumberGenerator()
        {
            Thread th = new Thread(new ThreadStart(RandomNumberThreadMethod));
            th.Start();
        }

        public void RandomNumberThreadMethod()
        {
            while (true)
            {
                // Ждем запрос на получение рандомного числа
                querryEvent.WaitOne();
                
                // Симулируем долгую работу
                int b;
                for (int i = 0; i < 10000; i++)
                {
                    for (int j = 0; j < 1000; j++)
                    {
                        b = i + j;
                    }
                }
                _randomNumber = _generator.Next(100);
                // Посылаем оповещение про то что мы сделали работу
                jobDone.Set();
            }
        }
  }
}

З.Ы. Если где-то слабанил - не судите срого, не так уж и часто пишу многопоточные приложения с такими блокировками )


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.4843 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.