예제 #1
0
        static void Main(string[] args)
        {
            InitGlobalizationEngine(Language.EN);

            Model   model  = new Model();
            Device  device = model.CreateDevice("Master");
            SMQueue queue  = model.CreateQueue("Accumulator");

            UInt64 transactCounter = 1;

            model.Schedule((int)Events.EventGenerate, model.Random(14, 26), transactCounter);
            model.Schedule((int)Events.EventEnd, 480, (ulong)1e9);

            // Объявим переменную, в которой будем хранить номер текущего транзакта
            UInt64 transact = 1;
            // И переменную, в которй будем хранить тип текущего события
            Events @event = Events.EventEnd;

            do
            {
                (UInt64, UInt64)top = model.Cause();
                // Разбираем пару на отдельные составляющие
                @event   = (Events)top.Item1;
                transact = top.Item2;

                switch (@event)
                {
                // Алгоритм обработки события порождения заявки
                case Events.EventGenerate:
                {
                    // Планируем сразу же событие резервирования устройства за этой заявкой
                    model.Schedule((int)Events.EventReserve, 0, transact);
                    // Увеличиваем счетчик транзактов
                    transactCounter++;
                    // Планируем поступление следующией заявки
                    model.Schedule((int)Events.EventGenerate, model.Random(14, 26), transactCounter);
                    break;
                }

                case Events.EventReserve:
                {
                    if (device.GetState() == Device.State.Idle)
                    {
                        // В случае, если устройство свободно, займем его заявкой
                        device.Reserve(transact);
                        // Запланируем освобождение устройства
                        model.Schedule((int)Events.EventRelease, model.Random(12, 20), transact);
                    }
                    else
                    {
                        queue.Add(transact, 0);
                    }

                    break;
                }

                case Events.EventRelease:
                {
                    device.Release();
                    if (queue.Count > 0)
                    {
                        UInt64 transactId = queue.Dequeue(out UInt64 stage).TransactId;
                        model.Schedule((int)Events.EventReserve, 0, transactId);
                    }

                    break;
                }

                case Events.EventEnd:
                {
                    break;
                }

                default:
                {
                    throw new Exception();
                }
                }
            }while (@event != Events.EventEnd);

            TextReporter textReporter = new TextReporter(model);

            textReporter.GetReport("output.txt");

            using (MdReporter mdReporter = new MdReporter(model))
            {
                mdReporter.GetReport("output.md");
            }

            using (HtmlReporter htmlReporter = new HtmlReporter(model))
            {
                htmlReporter.GetReport("output.html");
            }
        }