コード例 #1
0
        public SimClassPascal(trClassPascal badana, SimGroup sWiazka, agenda listaZd, aSimulation algSym)
            : base(badana, sWiazka, listaZd, algSym)
        {
            _S     = badana.S;
            _gamma = badana.PodajIntZgl(0) / _S;

            if (badana.progiKlasy == null)
            {
                maxLzr = sWiazka.V / badana.t + _S;
            }
            else
            {
                maxLzr = sWiazka.V / badana.tMin + _S;
            }
            zrodla = new processCall[maxLzr];
            for (int i = 0; i < maxLzr; i++)
            {
                zrodla[i] = null;
            }

            for (int zgl = 0; zgl < _S; zgl++)
            {
                zrodla[zgl] = new processPascal(listaZd, this.czNowegoZgl, this, zgl);
                listaZd.DodajProces(zrodla[zgl]);
            }
        }
コード例 #2
0
        public override void Obsluz()
        {
            switch (faza)
            {
            case processStage.oczekiwanie:      //Zgłoszenie trafia do systemu
                processCall nowe = new processPascal(ListaZd, klasaZgl.czNowegoZgl, symKlasaPascal, nrZr);
                ListaZd.DodajProces(nowe);
                symKlasaPascal.zrodla[nrZr] = nowe;

                if (klasaZgl.sWiazka.DodajZgl(this, ListaZd.zapStatystyk))         //próba zajęcia zasobów
                {
                    faza = processStage.zgloszenie;
                    czas = klasaZgl.czZakZgl;           //Losowanie czasu zakończenia obsługi zgłoszenia
                    ListaZd.DodajProces(this);          //Ponowne umieszczanie procesu na liście
                    nrNowoDodanegoZr = symKlasaPascal.znajdzWolneZr();
                    symKlasaPascal.zrodla[nrNowoDodanegoZr] = new processPascal(ListaZd, klasaZgl.czNowegoZgl, symKlasaPascal, nrNowoDodanegoZr);
                    ListaZd.DodajProces(symKlasaPascal.zrodla[nrNowoDodanegoZr]);
                }
                else
                {
                    if (ListaZd.zapStatystyk)
                    {
                        klasaZgl.lStraconychZgl++;          //Uaktualnianie statystyk klasy
                        klasaZgl.warWyjsciaStr--;
                        if (klasaZgl.warWyjsciaStr == 0)
                        {
                            klasaZgl.sWiazka.WarWyjscia--;        //Warunkiem wyjścia jest odpowiednia liczba str zgłoszeń
                        }
                    }
                }
                break;

            //Kończenie obsługi zgłoszenia
            case processStage.zgloszenie:
                klasaZgl.sWiazka.UsunZgl(this);             //Zwalnianie zasobów
                if (ListaZd.zapStatystyk)
                {
                    klasaZgl.lObsluzonychZgl++;             //Uaktualnianie statystyk klasu
                    klasaZgl.warWyjsciaObsl--;
                    if (klasaZgl.warWyjsciaObsl == 0)
                    {
                        klasaZgl.sWiazka.WarWyjscia2--;           //Awaryjnym warunkiem wyjścia jest przesymulowanie okr liczby zgł
                    }
                }
                faza = processStage.zakonczenie;
                ListaZd.UsunProces(symKlasaPascal.zrodla[nrNowoDodanegoZr]);
                symKlasaPascal.zrodla[nrNowoDodanegoZr] = null;
                break;
            }
        }