![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
18192123 |
![]()
Сообщение
#1
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Здраствуйте!
У меня вот такая тема для разработки - "Регулирование движения поездов на станции (Система массового обслуживания, потоки)"... Т.е. можно сказать, что процессорное время (ресурс) - наша станция, тогда потоки - поезда.. и нужно распланировать использование этого ресурса...Но это всё общие фразы.. Объясните пожалуйста, как это должно выглядеть более конкретно..я пока не очень понимаю.. |
18192123 |
![]()
Сообщение
#2
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Может быть у кого-нибудь есть идеи, как это эту тему оформить в виде приложения...С чего вообще начать? Подскажите пожалуйста! Плохо себе представляю, как это должно выгдядеть в моём приложении, в этом и проблема...
|
volvo |
![]()
Сообщение
#3
|
Гость ![]() |
Смотри... Я когда-то делал на форуме эмуляцию работы банка: есть клиенты пользователи, есть кассиры, очередь клиентов, и когда подходит очередь, клиент направляется к освободившемуся кассиру...
Можно сделать нечто подобное и здесь: есть "поезд", есть "путь", на который этот поезд можно поставить, и держать его там какое-то определенное время, и отправлять дальше; если свободных путей нет - то все поезда проходят мимо. Все действия (время прибытия поезда, время отправления) фиксируются в логе, возможно - сделать еще и визуализацию (скажем, какой-нибудь ListBox, в котором будет храниться информация о путях: "свободен"/"занят, кем занят, и когда освободится")... При таком подходе можно потоками представлять пути, а "поезда" - сделать просто структуру, хранящую ID, число вагонов (это если тебе захочется помучиться, и сделать более приближенную к реальности программу: на путь можно поставить поезд только, если длина поезда не превышает длины пути), время стоянки. Можно и поезда реализовать потоками, хотя я бы этого не делал, смысла не вижу в этом, основное "действующее лицо" в твоей программе - это все-таки Станция, и соответственно, Путь. Поезд - это так, проходящее ![]() Через рандомные промежутки времени генерируешь "поезд", пробегаешься по "путям" в поисках свободного и способного принять этот поезд, и направляешь поезд на подходящий путь... Только непонятно, что делать, если подходящих путей нет? Что, просто пропускать поезд на следующую станцию, пусть с ним там разбираются? Или тебе нужно нечто совсем другое? |
18192123 |
![]()
Сообщение
#4
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Мне убедительно посоветовали выбрать несколько иной подход:
есть станция, для неё предусмотрено n-е количество мест для стоянки проходящих поездов (для определённости - 3 места, например, для реализации этой идеи использовать семафор с максимальным количеством ресурсов=3). Если все места заняты - поезд (это будет поток) должен ожидать освобождения места для стоянки (т.е. поезд на время ожидания засыпает). Главная цель - не пропустить поезд на станцию, если там нет свободных мест. Для поезда, который занял своё место на станции - его время простоя должно определяться по закону (экспоненциальному наверное - с тем смыслом, что чем дольше поезд простоял, тем выше вероятность, что скоро он отправится дальше и освободит место стоянки) Потоки-поезда должны генерироваться по з-ну Пуассона. Выходные данные: думаю представить статистику по простоям и по ожиданию освобождения места.. Пока не представляю себе, как должна выглядеть генерация потока-поезда по Пуассону.. тоже самое с временем простоя на станции...не знаю, как поезда-поток "заставить" остаться там на некоторое время (тоже определяемое по закону).. Пока решила начать с того, что по рандому создавать поезда-потоки, в функции потока в зависимости от состояния семафора записывать на listbox идентификатор поезд и его состояние..Вот только выводятся поезда как попало...Даже не знаю, в чём причина может быть.. А вообще хочу представить движение-остановку поездов-потоков в виде передвижения-застывания label с каким-нибудь текстом..
Эскизы прикрепленных изображений ![]() |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата Вот только выводятся поезда как попало Не то ты делаешь ![]() DWORD TrainThread(int *p) , а там, где ты запускаешь потоки - дождись их завершения, иначе ты уничтожаешь семафор сразу после их инициализации, ничего не успеет произойти: WaitForMultipleObjects(maxTrains, trainHandles, TRUE, INFINITE); // дождаться всех Вот что выдало мне: Цитата Train #3... Train #5... Train #7... Train #4... Train #2... Train #1... Train #6... Train #3 is stoping... Train #8... Train #9... Train #5 is stoping... Train #10... Train #7 is stoping... Train #4: no empty places...waiting Train #2: no empty places...waiting Train #1: no empty places...waiting Train #6: no empty places...waiting Train #8: no empty places...waiting Train #10: no empty places...waiting Train #9: no empty places...waiting Train #4 is stoping... Train #2 is stoping... Train #1 is stoping... Train #8: no empty places...waiting Train #6: no empty places...waiting Train #10: no empty places...waiting Train #9: no empty places...waiting Train #8 is stoping... Train #6 is stoping... Train #10 is stoping... Train #9: no empty places...waiting Train #9 is stoping... |
18192123 |
![]()
Сообщение
#6
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Эх...а у меня не работает..приложение зависает..
изменила функцию потока..добавила ожидание завершения потоков..
и теперь мы просто висим...В чём же может быть дело?( |
volvo |
![]()
Сообщение
#7
|
Гость ![]() |
Цитата В чём же может быть дело?( В том, что я проверяю в консольном приложении, там нет необходимости в синхронизации, а ты - в оконном, а в оконном надо обрабатывать сообщения.В качестве "костыля" могу предложить использовать: int b = 1; вместо WaitForMultipleObjects(maxTrains, trainHandles, TRUE, INFINITE); // дождаться всех Кстати, случайными значения, генерируемые по rand() у тебя тоже не будут. Будет постоянно генерироваться одно и то же число. Чтобы это были действительно случайные числа, надо вызывать srand() не в основном потоке, а в каждом дочернем: DWORD TrainThread(int *p) |
18192123 |
![]()
Сообщение
#8
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#9
|
Гость ![]() |
Тебе нужно заставить форму обработать полученные сообщения и элементарно перерисоваться, иначе ты ж ничего не увидишь... В Билдеровском VCL для этого используется метод Application->ProcessMessages(). Для чистого WinAPI, скорее всего, подойдет вот это:
case WAIT_TIMEOUT: |
18192123 |
![]()
Сообщение
#10
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Спасибо большое!!
Теперь насчёт генерации потоков-поездов по Пуассоновскому з-ну.. Объясните пожалуйста, как это должно выглядеть..?? Я даже не представляю..Может потоки будут генерироваться по таймеру через промежутки времени, которые определяются в соответствии с з. Пуассона? или я не в том направлении думаю? |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Цитата Может потоки будут генерироваться по таймеру через промежутки времени, которые определяются в соответствии с з. Пуассона? Скорее всего так оно и должно быть... Как моделировать распределение Пуассона, знаешь? |
18192123 |
![]()
Сообщение
#12
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
|
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Вот тут лежит
Цитата вариант программной функции, осуществляющей моделирование распределения Пуассона с параметром λ ... Последовательные вызовы этой функции с одним и тем же параметром будут выдавать последовательность целых чисел, распределенных по Пуассону. Хотя программа на Паскале, я думаю перенести 10 строк кода не будет проблемой? |
18192123 |
![]()
Сообщение
#14
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Вот тут лежит ... Последовательные вызовы этой функции с одним и тем же параметром будут выдавать последовательность целых чисел, распределенных по Пуассону. Хотя программа на Паскале, я думаю перенести 10 строк кода не будет проблемой? спасибо, с этим разберусь. ну вот сгенерировала я первый поток-поезд...потом с помощью этой функции получаю число, которое и буду рассматривать, как промежуток времени, через который нужно сгенерировать следующий поезд-поток? скажите, я правильно понимаю? |
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
Да, все правильно... Ф-ю Puass можно использовать именно для генерации временных интервалов между созданием потоков.
|
18192123 |
![]()
Сообщение
#16
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
Что-то я явно не так делаю...у меня функция Puass() всегда возвращает единицу...:
И ещё добавила SetTimer..Правда очень сомневаюсь в правильности его применения.. Думаю не всё так просто с применением таймера в моём случае..Объясните пожалуйста, как будет верно..:
Сообщение отредактировано: 18192123 - 15.12.2008 18:08 |
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
Цитата Что-то я явно не так делаю Угу... Во-первых, зачем тебе понадобилось инициализировать ГСЧ внутри Puass? После этого даже если саму функцию Puass написать правильно - будут глюки, ГСЧ не должен инициализироваться в одном потоке больше одного раза.Кроме всего прочего, функция Puass переведена неправильно, ты забыла, что в Repeat/Until условие - обратное, не такое, как в While. Цикл Repeat/Until выполняется, пока условие ложно. Как только оно станет истинным - цикл немедленно завершается. А ты заменила паскалевский Repeat/Intil Сишным while-ом с тем же условием, вот тебе и результат: после первой же итерации цикл завершается, при этом K = 1, что ты и наблюдала ![]() Таймер тебе вообще не нужен. Все проще: int Puass(double Lamda) Сообщение отредактировано: volvo - 15.12.2008 18:52 |
18192123 |
![]()
Сообщение
#18
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
здравствуйте!
скажите пожалуйста, а как сгенерировать время простоя поезда на станции по экспоненциальному з-ну? т.е. вот здесь:
|
volvo |
![]()
Сообщение
#19
|
Гость ![]() |
|
18192123 |
![]()
Сообщение
#20
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 920 Пол: Женский Реальное имя: Марина Репутация: ![]() ![]() ![]() |
оу..прошу прощения..как-то упустила, что з-н Пуассона вполне экспоненциальный
![]() Добавлено через 19 мин. Хотелось бы теперь движение-остановку поездов-потоков представить графически... Примерно так: поезд-поток (например в виде Label) подъехал к станции, есть места - переходит на свободное место стоянки (постоял некоторое время - уехал со станции), нет мест - ждёт перед станцией. Подскажите пожалуйста, как соотнести задумку с уже имеющимся? Прикрепленные файлы ![]() |
![]() ![]() |
![]() |
Текстовая версия | 18.06.2025 23:05 |