Beispiel #1
0
        public MainWindow()
        {
            InitializeComponent();

            var smpl = new SmplModel();

            var MuDev = smpl.CreateMultiDevice("eq", 4);
            var queue = smpl.CreateQueue("qu");

            smpl.EventCaused += smpl_EventCaused;

            smpl.Schedule((int)ModelEvents.PZ, smpl.IRandom(5, 10));
            smpl.Schedule((int)ModelEvents.ZM, MaxTime); //10000);

            //while (smpl.Cause()) ;
            Model = smpl;
            Viewer = new SmplModelViewer(smpl);

            DataContext = this;

            /*// Initialize model
            var smpl = new SmplModel();

            var vs = smpl.CreateDevice("re");
            var qu = smpl.CreateQueue("er");

            smpl.Schedule((int)ModelEvents.PZ, smpl.IRandom(1, 2));
            smpl.Schedule((int)ModelEvents.ZM, 10000);

            smpl.EventCaused += smpl_EventCaused;

            // Launch model
            while (smpl.Cause()) ;

            // Report
            smpl.Report();*/
        }
Beispiel #2
0
        static void Main(string[] args)
        {
            /*var gen = new SMPLSharp.Utils.SmplRandomGenerator();
            for (var i = 0; i < 50; i++)
            {
                Console.WriteLine(gen.IRandom(12, 24));
                Console.WriteLine(gen.IRandom(12, 20));
            }
            Console.Read();*/

            // Initialize model
            var smpl = new SmplModel();

            var MuDev = smpl.CreateMultiDevice("eq", 4);
            var queue = smpl.CreateQueue("qu");

            smpl.EventCaused += smpl_EventCaused;

            smpl.Schedule((int)ModelEvents.PZ, smpl.IRandom(5, 10));
            smpl.Schedule((int)ModelEvents.ZM, 100); //10000);

            //while (smpl.Cause()) ;
            var viewer = new SmplModelViewer(smpl);
            viewer.Play(1000, false);

            /*
            // Launch model
            int e = 0;
            object j;
            while (e != (int)ModelEvents.ZM)
            {
                smpl.Cause(out e, out j);

                // Hande model events
                switch ((ModelEvents)e)
                {
                    case ModelEvents.PZ:
                        smpl.Schedule((int)ModelEvents.PZ, smpl.IRandom(2, 8));
                        if (!MuDev.IsBusy)
                        {
                            int id = MuDev.Reserve();
                            smpl.Schedule((int)ModelEvents.ZO, smpl.IRandom(12, 30), id);
                        }
                        else queue.Enqueue();
                        break;

                    case ModelEvents.ZO:
                        MuDev.Release( (int)j);
                        if (!queue.IsEmpty)
                        {
                            int id = MuDev.Reserve();
                            smpl.Schedule((int)ModelEvents.ZO, smpl.IRandom(12, 30), id);
                        }
                        break;
                }
            }

             */
            // Report
            Console.Write(smpl.Report());
        }
Beispiel #3
0
        static void Main(string[] args)
        {
            const int modelingtime = 3000;//время моделирования
            const int zm = 0, newzad = 1, proc1craked = 2, proc1repared = 3, zo1 = 4, zo2 = 5, proc2on = 6;
            SmplModel model = new SmplModel();
            model.CreateDevice("proc1");//создание proc1
            model.CreateDevice("proc2");//создание proc2
            model.CreateQueue("line");//создание line
            model.Schedule(zm, modelingtime);
            model.Schedule(newzad, model.IRandom(5, 15));
            model.Schedule(proc1craked, model.IRandom(130, 170));
            bool p1cracked = false, proc2ison = false, proc2needreserv = false;
            int reshzad = 0, otkaz = 0, prerv = 0;
            float proc2koef = 0;
            SmplEvent e;

            while (true)
            {
                model.Cause(out e);

                switch (e.EventID)
                {
                    case zm://завершение моделирования
                        Console.WriteLine("Число решенных задач: {0}\nЧисло отказов процессора: {1}\nЧисло прерванных задач: {2}\nМаксимальная длина очереди: {3}\nКоэффициент загрузки резервного процессора: {4}\n", reshzad, otkaz, prerv, model.Queues["line"].MaxLength, proc2koef / (float)reshzad);
                        Console.WriteLine("\n" + model.Report());
                        Console.ReadKey();
                        Environment.Exit(0);
                        break;
                    case newzad://поступление новой задачи
                        string dev = "";
                        int zo = 0;
                        if (p1cracked)
                        {
                            dev = "proc2";
                            zo = zo2;
                        }
                        else
                        {
                            dev = "proc1";
                            zo = zo1;
                        }

                        if ((!model.Devices[dev].IsBusy)&&!(dev == "proc2" && !proc2ison/*proc1 уже сломан, а proc2 еще не включен*/))
                        {
                            //dev не занят
                            model.Devices[dev].Reserve();
                            model.Schedule(zo, model.IRandom(3, 7));

                        }
                        else
                        {
                            //dev занят
                            model.Queues["line"].Enqueue();
                        }
                        model.Schedule(newzad, model.IRandom(5, 15));
                        break;
                    case zo1://завершение облуживания на proc1
                        model.Devices["proc1"].Release();
                        reshzad++;
                        if (!model.Queues["line"].IsEmpty)
                        {
                            //очередь не пуста
                            model.Queues["line"].Head();
                            model.Schedule(zo1, model.IRandom(3, 7));
                            model.Devices["proc1"].Reserve();

                        }

                        break;
                    case proc1craked://proc1 сломался
                        otkaz++;
                        p1cracked = true;
                        model.Schedule(proc2on, 2);
                        if (model.Devices["proc1"].IsBusy)
                        {
                            //proc1 занят
                            model.Devices["proc1"].Release();
                            int zotime = model.Cancel(zo1);
                            //на proc1 была задача
                            model.Schedule(zo2, zotime + 2);
                            proc2needreserv = true;

                        }
                        model.Schedule(proc1repared, model.IRandom(10, 30));
                        break;
                    case zo2://завершения обслуживаняи на proc2
                        model.Devices["proc2"].Release();
                        reshzad++;
                        if (!model.Queues["line"].IsEmpty)
                        {
                            //очередь не пуста
                            model.Queues["line"].Head();
                            model.Schedule(zo2, model.IRandom(3, 7));
                            model.Devices["proc2"].Reserve();
                        }

                        proc2koef++;
                        break;
                    case proc1repared://proc1 восстановился

                        if (model.Devices["proc2"].IsBusy)
                        {
                            //proc2 занят
                            model.Devices["proc2"].Release();
                            model.Cancel(zo2);
                            proc2ison = false;
                            prerv++;
                        }
                        if (!model.Queues["line"].IsEmpty)
                        {
                            //очередь не пуста
                            model.Queues["line"].Head();
                            model.Devices["proc1"].Reserve();
                            model.Schedule(zo1, model.IRandom(3, 7));
                        }
                        model.Schedule(proc1craked, model.IRandom(130, 170));
                        p1cracked = false;
                        break;
                    case proc2on://proc2 включился
                        if (proc2needreserv)
                        {
                            //нужно зарезервировать proc2, т.к. на него поступила задача с proc1
                            model.Devices["proc2"].Reserve();
                            proc2needreserv = false;
                        }
                        else
                        {
                            //нужно взять новую задачу
                            if (!model.Queues["line"].IsEmpty)
                            {
                                model.Queues["line"].Head();
                                model.Schedule(zo2, model.IRandom(3, 7));
                                model.Devices["proc2"].Reserve();
                            }
                        }
                        proc2ison = true;
                        break;
                }

            }
        }