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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Sleeping Barber 
:(
    Опции темы
fromrus
Дата 9.10.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нужно реализовать работу спящего парикмахера...Перерыл по инета-все на жаве или не то что нуна...
Вывод должен быть такой:

"Клиент 1 пришел.
Клиент 1 разбудил парикмахера
Клиент 1 обслуживается...
клиент 2 пришел
Клиент 2 ждет...
Клиент 3 пришел
Клиент 3 ушел,нет свободного места
Клиент 1 подстригся и ушел
Клиент 2 обслуживается..."
и так далее

вот что надумал:
Код

  class Barber
    {
       
        public Barber ()
        {
            Thread barberThread = new Thread(delegate() { ;});
            barberThread.Start();
        }
   

далее в классе Клиент я блокирую к нему доступ через lock:
Код

 class Client
    {
        int chairs = 5;
        bool serving;
        Barber barber = new Barber();
        int num;
            
        public Client()
        {
               
            Thread clientThread = new Thread(new ThreadStart(ClientArrived));
            clientThread.Start();
            
        }
        private void ClientArrived()
        {
            num++;
            
            Console.WriteLine("Client #{0} has arrived", num);
            
            if (chairs != 0)
            {
                //lock ((object)chairs)
                //{
                    chairs--;
                //}
                if (serving)
                {
                    Console.WriteLine("Client #{0} is waiting", num);
                    Thread.Sleep(500);
                }
                lock (barber)
                {
                    Console.WriteLine("Client #{0} is cutting",num);
                    serving = true;
                    Thread.Sleep(new Random().Next(1000, 30000));
                    
                }
                Console.WriteLine("Client #{0} has cutted and gone", num);
                serving = false;
                lock ((object)chairs)
                {
                    chairs++;
                }
                
            }
            else
                Console.WriteLine("Client #{0} has gone-there isn't free chairs",num);
            
        }


ну и в Main  я через Timer модулирую рандомный приход клиентов:
Код

 Timer t=new Timer(delegate(Object o){new Client();},null,0,new Random().Next(1000,3000));
            Console.Read();

И вотпроблемы: как обеспечить "сон" парикмахера...Что-то подсказывает что нуна исполбзовать WaitHandle,но как-не додумался...Как обеспечить правильные номера клиентов-тут меня прям переклинило....
Возможн ли использовать semaphore вместо bool serving,чтобы вывод ыл такой же?
PM MAIL ICQ   Вверх
MasterOfCode
Дата 9.10.2008, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

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



А как ты описываешь состояние парикмахера, булевой переменной?

Добавлено через 2 минуты и 13 секунд
еще, наверное, необходима переменная времени описывающая кол-во времени которое готов ждать клиент. поистечении которого просто гасить поток с клиеном и в консоле фиксировать его уход.


--------------------
user posted image
PM ICQ   Вверх
fromrus
Дата 9.10.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(MasterOfCode @ 9.10.2008,  17:08)
А как ты описываешь состояние парикмахера, булевой переменной?

Добавлено @ 17:10
еще, наверное, необходима переменная времени описывающая кол-во времени которое готов ждать клиент. поистечении которого просто гасить поток с клиеном и в консоле фиксировать его уход.

1.да только этой переменной
2.То что ты сказал можно реализовать через Семафор.WaitOne()-там одна из перегрузок такая есть...Но тогда становится не нужен учет кол-во свободных стульев и как результат к парикмахеру может прийти хоть 100 клиентов...Не покатит...
PM MAIL ICQ   Вверх
MasterOfCode
Дата 10.10.2008, 06:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

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



Цитата(fromrus @  9.10.2008,  20:54 Найти цитируемый пост)
1.да только этой переменной

Ну а в чем проблема, если у парикмахера может быть 2 состояния: спит и работает, то true, false у свойства. smile


Цитата(fromrus @  9.10.2008,  20:54 Найти цитируемый пост)
2.То что ты сказал можно реализовать через Семафор.WaitOne()-там одна из перегрузок такая есть...Но тогда становится не нужен учет кол-во свободных стульев и как результат к парикмахеру может прийти хоть 100 клиентов...Не покатит... 

Дак и так, разве к парикмахеру может придти только определённое кол-во людей. По моему стульями неограничено. Например 31 августа. Представляешь сколько народу в парикмахерской. И все стоят ждут. smile
Я бы тут реализовал просто таймер на то какое кол-во способен ждать той или иной клиент.


--------------------
user posted image
PM ICQ   Вверх
azesmcar
Дата 10.10.2008, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



кстати очередь тоже можно реализовать..и каждый стоит ждет столько сколько может. но ведь еще все зависит от того сколько перед ним народу..человек должен примерно расчитать, если перед ним стоит 20 человек а у него 5 минут на ожидание он должен сразу уйти..
PM   Вверх
MasterOfCode
Дата 10.10.2008, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

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



Цитата(azesmcar @  10.10.2008,  10:20 Найти цитируемый пост)
кстати очередь тоже можно реализовать..и каждый стоит ждет столько сколько может. но ведь еще все зависит от того сколько перед ним народу..человек должен примерно расчитать, если перед ним стоит 20 человек а у него 5 минут на ожидание он должен сразу уйти..

Логично! smile 


--------------------
user posted image
PM ICQ   Вверх
MasterOfCode
Дата 10.10.2008, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

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



Но так же тогда нужно ввести коэффициент необходимости стрижки. Тогда человеку неважно сколько перед ним человек, он будет ждать все время которое у него в параметре.
например коэффициент необходимости qNeed in {0.01 .. 1}
тогда кол-во человек в очереди которое он готов ждать cPeopleWait = (qNeed * TimeWait))/cPeople, где TimeWait = время ожидаиня, qNeed - коэффициент необходимости, cPeople - кол-во человек в очереди.
cPeopleWait - если больше cPeople то остается ждать.
например человеку необходимо подстричся любым способом, притом у него есть всего 20 минут до поезда, к примеру. qNeed = 1, TimeWait = 20 минут. Заходит в парикмахерскую, там 3 человека.
получаем (1 * 20)/3 = 6.6 остается ждать.
Другой пример. 
Человеку необходимо подстричься к завтрашнему дню, а через час начинается матч.
 qNeed = 0.5, TimeWait = 60 минут. Заходит в парикмахерскую, там 5 человек.
получаем (0.5 * 60)/5 = 6 остается ждать. smile


--------------------
user posted image
PM ICQ   Вверх
azesmcar
Дата 10.10.2008, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



MasterOfCode тут еще встает вопрос о там до скольких работает парихмахер...возьмем к примеру клиента у которого qNeed зашкаливает..надо ему постричся позарез, а тут как назло очередь из 80 человек, и успеют они постричся только через 12 часов..а там либо дата смениться (ему то нужно сегодня) либо просто парикмахерская закроется (или такого нету?)
кстати возможность пройти по блату без очереди предусмастивается? smile
PM   Вверх
MasterOfCode
Дата 10.10.2008, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


elwin
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 24.4.2008
Где: World.Russia.Tyum en

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



Цитата(azesmcar @  10.10.2008,  11:32 Найти цитируемый пост)
MasterOfCode тут еще встает вопрос о там до скольких работает парихмахер...возьмем к примеру клиента у которого qNeed зашкаливает..надо ему постричся позарез, а тут как назло очередь из 80 человек, и успеют они постричся только через 12 часов..а там либо дата смениться (ему то нужно сегодня) либо просто парикмахерская закроется (или такого нету?)

Тут наверное нужно сравнить время TimeWait и ввести новую переменную о том во сколько заканчивает работу парикмахер например TimeWorkBarber, если TimeWait > TimeWorkBarber тогда уходить клиенту. если нет, то производить расчет по формуле. smile


Цитата(azesmcar @  10.10.2008,  11:32 Найти цитируемый пост)

кстати возможность пройти по блату без очереди предусмастивается? smile 

Я думаю нужно предусмотреть, как минимум 1 раз в 2 дня у парикмахера такой "клиент" появляется


--------------------
user posted image
PM ICQ   Вверх
mihryak
Дата 10.10.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Систему автоматизации парикмахерских решили замутить? smile

Я подобную задачу решил таким способом (очень кратко опишу):
- Есть Operation, в такой постановке это будет лохматый клиент
- Есть WorkThread, представляющая из себя парикмахера, в нём реализован бесконечный цикл с возможностью аборта
Суть работы такова - обрабатывается клиент, через AutoResetEvent парикмахер засыпает до следующего.
- Есть ThreadPool, здесь это штат парикмахеров с заранее определённым максимальным числом. При появлении нового клиента будится заснувший парикмахер, либо берётся (создаётся) ещё незадействованный. Если все заняты, а клиент уже зашёл, Пул ругается менеджеру очереди (см. ниже).
- Есть менеджер очереди, который встречает клиентов, сортирует их при добавлении по важности (приоритетам), отдаёт их Пулу на подстигание.

Самая ответственная часть - обеспечить взаимодействие всех этих слоёв. Я это сделал через эвенты - парикмахер сообщает пулу, что он закончил, пул сообщает очереди, что есть свободные слоты. Мне не шибко нравится такое решение, общая схема выглядит довольно громоздко, но позволяет использовать, например, только операции и рабочие поток безо всяких пулов и очередей, или пул без очереди.
PM MAIL ICQ   Вверх
fromrus
Дата 12.10.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Система автоматизации парикмахерких покатит и на startUP smile 
to mihryak
твоя система действительно слишком большая...У мя тока 1 парикмахер,и нет надобности в системе управления... smile  smile  smile 
PM MAIL ICQ   Вверх
teesync
Дата 26.7.2022, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
squilia
Дата 15.8.2022, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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