////////////////////////////////////////////////////////////////////////////
// model2-timeout.cc SIMLIB/C++
//
// Ukázkový model s netrpělivými požadavky
//
#include "simlib.h"
const int TIMEOUT = 20;
const int SERVICE = 10;
// deklarace globálních objektů
Facility Box("Linka");
Histogram Tabulka("Tabulka", 0, 1, SERVICE+TIMEOUT+1);
long ncount = 0;
class Timeout : public Event {
Process *ptr; // který proces
public:
Timeout(double t, Process *p): ptr(p) {
Activate(Time+t); // kdy vyprší timeout
}
void Behavior() {
// ptr->Out(); // vyjmout z fronty
//ptr->Terminate(); // likvidace
delete ptr; // likvidace
ncount++; // počitadlo
Cancel(); // konec události (SIMLIB BUG)
}
};
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
Event *timeout = new Timeout(TIMEOUT,this); // nastavit timeout
Seize(Box); // obsazení zařízení Box
delete timeout; // zrušit neaktivovaný timeout
Wait(SERVICE); // obsluha
Release(Box); // uvolnění
Tabulka(Time-Prichod); // doba obsluhy a čekání
}
};
class Generator : public Event { // generátor zákazníků
void Behavior() { // --- popis chování generátoru ---
(new Zakaznik)->Activate(); // nový zákazník, aktivace v čase Time
Activate(Time+Exponential(1e3/150)); // interval mezi příchody
}
};
int main() { // popis experimentu s modelem
//DebugON();
Print("model2-timeout -- příklad SIMLIB/C++\n");
SetOutput("model2-timeout.out");
Init(0,1000); // inicializace experimentu, čas bude 0..1000
(new Generator)->Activate(); // generátor zákazníků, jeho aktivace
Run(); // simulace
Print("Počet netrpělivých zákazníků: %d \n", ncount);
Box.Output(); // tisk výsledků
Tabulka.Output();
return 0;
}
// konec
syntax highlighted by Code2HTML, v. 0.9.1