| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Sleeping Barber |
| Автор: fromrus 9.10.2008, 16:39 | ||||||
| Нужно реализовать работу спящего парикмахера...Перерыл по инета-все на жаве или не то что нуна... Вывод должен быть такой: "Клиент 1 пришел. Клиент 1 разбудил парикмахера Клиент 1 обслуживается... клиент 2 пришел Клиент 2 ждет... Клиент 3 пришел Клиент 3 ушел,нет свободного места Клиент 1 подстригся и ушел Клиент 2 обслуживается..." и так далее вот что надумал:
далее в классе Клиент я блокирую к нему доступ через lock:
ну и в Main я через Timer модулирую рандомный приход клиентов:
И вотпроблемы: как обеспечить "сон" парикмахера...Что-то подсказывает что нуна исполбзовать WaitHandle,но как-не додумался...Как обеспечить правильные номера клиентов-тут меня прям переклинило.... Возможн ли использовать semaphore вместо bool serving,чтобы вывод ыл такой же? |
| Автор: MasterOfCode 9.10.2008, 17:08 |
| А как ты описываешь состояние парикмахера, булевой переменной? Добавлено через 2 минуты и 13 секунд еще, наверное, необходима переменная времени описывающая кол-во времени которое готов ждать клиент. поистечении которого просто гасить поток с клиеном и в консоле фиксировать его уход. |
| Автор: fromrus 9.10.2008, 17:54 | ||
1.да только этой переменной 2.То что ты сказал можно реализовать через Семафор.WaitOne()-там одна из перегрузок такая есть...Но тогда становится не нужен учет кол-во свободных стульев и как результат к парикмахеру может прийти хоть 100 клиентов...Не покатит... |
| Автор: azesmcar 10.10.2008, 07:20 |
| кстати очередь тоже можно реализовать..и каждый стоит ждет столько сколько может. но ведь еще все зависит от того сколько перед ним народу..человек должен примерно расчитать, если перед ним стоит 20 человек а у него 5 минут на ожидание он должен сразу уйти.. |
| Автор: MasterOfCode 10.10.2008, 08:02 | ||
Логично! |
| Автор: MasterOfCode 10.10.2008, 08:23 |
| Но так же тогда нужно ввести коэффициент необходимости стрижки. Тогда человеку неважно сколько перед ним человек, он будет ждать все время которое у него в параметре. например коэффициент необходимости 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 остается ждать. |
| Автор: azesmcar 10.10.2008, 08:32 |
| MasterOfCode тут еще встает вопрос о там до скольких работает парихмахер...возьмем к примеру клиента у которого qNeed зашкаливает..надо ему постричся позарез, а тут как назло очередь из 80 человек, и успеют они постричся только через 12 часов..а там либо дата смениться (ему то нужно сегодня) либо просто парикмахерская закроется (или такого нету?) кстати возможность пройти по блату без очереди предусмастивается? |
| Автор: MasterOfCode 10.10.2008, 08:40 | ||||
Тут наверное нужно сравнить время TimeWait и ввести новую переменную о том во сколько заканчивает работу парикмахер например TimeWorkBarber, если TimeWait > TimeWorkBarber тогда уходить клиенту. если нет, то производить расчет по формуле.
Я думаю нужно предусмотреть, как минимум 1 раз в 2 дня у парикмахера такой "клиент" появляется |
| Автор: mihryak 10.10.2008, 12:32 |
| Систему автоматизации парикмахерских решили замутить? Я подобную задачу решил таким способом (очень кратко опишу): - Есть Operation, в такой постановке это будет лохматый клиент - Есть WorkThread, представляющая из себя парикмахера, в нём реализован бесконечный цикл с возможностью аборта Суть работы такова - обрабатывается клиент, через AutoResetEvent парикмахер засыпает до следующего. - Есть ThreadPool, здесь это штат парикмахеров с заранее определённым максимальным числом. При появлении нового клиента будится заснувший парикмахер, либо берётся (создаётся) ещё незадействованный. Если все заняты, а клиент уже зашёл, Пул ругается менеджеру очереди (см. ниже). - Есть менеджер очереди, который встречает клиентов, сортирует их при добавлении по важности (приоритетам), отдаёт их Пулу на подстигание. Самая ответственная часть - обеспечить взаимодействие всех этих слоёв. Я это сделал через эвенты - парикмахер сообщает пулу, что он закончил, пул сообщает очереди, что есть свободные слоты. Мне не шибко нравится такое решение, общая схема выглядит довольно громоздко, но позволяет использовать, например, только операции и рабочие поток безо всяких пулов и очередей, или пул без очереди. |
| Автор: fromrus 12.10.2008, 19:57 |
| Система автоматизации парикмахерких покатит и на startUP to mihryak твоя система действительно слишком большая...У мя тока 1 парикмахер,и нет надобности в системе управления... |
| Автор: teesync 26.7.2022, 22:33 |
Модератор: Сообщение скрыто. |
| Автор: squilia 15.8.2022, 03:51 |
Модератор: Сообщение скрыто. |