////////////////////////////////////////////////////////////////////////////
// Model MODEL4.CPP               SIMLIB/C++
//
// Ukázkový model obslužného střediska (2 zařízení 1 fronta)
//

#include "simlib.h"
#include <stdio.h>

// deklarace globálních objektů
Facility  Box[2];                 // bohužel nelze inicializovat
Queue InQueue("Čekající zákazníci");
Histogram Tabulka("Tabulka",0,5,20);

class Zakaznik : public Process { // třída zákazníků
  double Prichod;                 // atribut každého zákazníka
  void Behavior() {               // --- popis chování zákazníka ---
    Prichod = Time;               // čas příchodu zákazníka
    if (!Box[0].Busy())      Seize(Box[0]); // obsazení zařízení1
    else if (!Box[1].Busy()) Seize(Box[1]); // obsazení zařízení2
    else { 
        Into(InQueue); Passivate(); // čekání ve frontě
	// zařízení1 nebo zařízení2 při Release automaticky obsadí
        // pozor - změna sémantiky ve verzi SIMLIB 2.17
    }
    Wait(10);                     // obsluha
    // pozor!! nevíme, které zařízení jsme skutečně obsadili
    if (Box[0].in==this) Release(Box[0]); // uvolnění
    else                 Release(Box[1]);
    Tabulka(Time-Prichod);        // doba obsluhy a čekání
  }
  public: Zakaznik() { Activate(); } // konstruktor aktivuje
};

class Generator : public Event {  // generátor zákazníků
  void Behavior() {               // --- popis chování generátoru ---
    new Zakaznik;                 // nový zákazník
    Activate(Time+Exponential(1e3/150));  // interval mezi příchody
  }
  public: Generator() { Activate(); } // konstruktor aktivuje
};

int main() {
  Print(" MODEL4 - test SIMLIB\n");
  SetOutput("model4.out");
  Init(0,1000);              // inicializace experimentu, čas bude 0..1000
  Box[0].SetQueue(InQueue);
  Box[0].SetName("Box[0]");
  Box[1].SetQueue(InQueue);
  Box[1].SetName("Box[1]");
  new Generator;             // generátor zákazníků
  Run();                     // simulace
  Box[0].Output();           // tisk výsledků
  Box[1].Output();
  InQueue.Output();
  Tabulka.Output();
  return 0;
}

// konec


syntax highlighted by Code2HTML, v. 0.9.1