-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimulacion.cpp
199 lines (185 loc) · 7.12 KB
/
simulacion.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#include "simulacion.h"
Simulacion::Simulacion(){
//Bandas
bandaMasa = new Banda("Masa");
bandaChocolate = new Banda("Chocolate");
bandaGalletasCrudas = new Banda("Galletas Crudas");
bandaInspectores = new Banda("Galletas Cocinadas");
//Estructuras
almacenPrima = new AlmacenPrima();
carritoEntrega = new CarritoEntrega(almacenPrima);
QString nombresMezcladora[] = {"Mezcladora 1", "Mezcladora 2"};
for(int i = 0; i < 2; i++){
mezcladorasMasa[i] = new MezcladoraMasa(nombresMezcladora[i], bandaMasa, almacenPrima,carritoEntrega);
}
mezcladoraChocolate = new MezcladoraChocolate("Mezcladora Chocolate", bandaChocolate, almacenPrima,carritoEntrega);
ensambladora = new Ensambladora(bandaGalletasCrudas, bandaMasa, bandaChocolate);
for(int j = 0; j < 6; j++){
bandejas[j] = new Bandeja(bandaInspectores);
}
horno = new Horno(bandejas, bandaGalletasCrudas);
listaGalletas = new ListaGalletas();
empacadora = new Empacadora(listaGalletas);
inspector1 = new Inspector(empacadora, bandaInspectores);
inspector2 = new Inspector(empacadora, bandaInspectores);
almacenTerminal = new AlmacenTerminal(listaGalletas);
carritosSalida = NULL;
//Hilos
hiloCarritoEntrega = new HiloCarritoEntrega(NULL, carritoEntrega);
hiloCarritoEntrega->start();
for(int i = 0; i < 2; i++){
hilosMezcladorasMasa[i] = new HiloMezcladoraMasa(NULL, mezcladorasMasa[i]);
hilosMezcladorasMasa[i]->start();
}
hiloMezcladoraChocolate = new HiloMezcladoraChocolate(NULL, mezcladoraChocolate);
hiloMezcladoraChocolate->start();
hiloEnsambladora = new HiloEnsambladora(NULL, ensambladora);
hiloEnsambladora->start();
hiloHorno = new HiloHorno(NULL, horno);
hiloHorno->start();
for(int i = 0; i < 6; i++){
hilosBandeja[i] = new HiloBandeja(NULL, bandejas[i]);
hilosBandeja[i]->start();
}
hiloInspector1 = new hiloInspector(NULL, inspector1);
hiloInspector1->start();
hiloInspector2 = new hiloInspector(NULL, inspector2);
hiloInspector2->start();
hiloEmpacadora = new HiloEmpacadora(NULL, empacadora);
hiloEmpacadora->start();
hilosCarritoSalida = NULL;
hiloAlmacenTerminal = new HiloAlmacenTerminal(NULL, almacenTerminal);
hiloAlmacenTerminal->start();
}
/*
* Pone las banderas de pausa de todos los hilos en falso para iniciar o
* reanudar la simulacion.
*/
void Simulacion::iniciarHilos(){
hiloCarritoEntrega->pause = false;
for(int i = 0; i < 2; i++){
hilosMezcladorasMasa[i]->pause = false;
}
hiloMezcladoraChocolate->pause = false;
hiloEnsambladora->pause = false;
hiloHorno->pause = false;
for(int i = 0; i < 6; i++){
hilosBandeja[i]->pause = false;
}
hiloInspector1->pause=false;
hiloInspector2->pause=false;
empacadora->estaActiva = true;
hiloEmpacadora->pause=false;
if(hilosCarritoSalida != NULL){
for(int i = 0; i < listaGalletas->largoListaGalletas(); i++){
hilosCarritoSalida[i]->pause = false;
}
}
hiloAlmacenTerminal->pause = false;
}
/*
* Pone las banderas de pausa de todos los hilos en verdadero para detener
* temporalmente la simulacion.
*/
void Simulacion::pausarHilos(){
hiloCarritoEntrega->pause = true;
for(int i = 0; i < 2; i++){
hilosMezcladorasMasa[i]->pause = true;
}
hiloMezcladoraChocolate->pause = true;
hiloEnsambladora->pause = true;
hiloHorno->pause = true;
for(int i = 0; i < 6; i++){
hilosBandeja[i]->pause = true;
}
hiloInspector1->pause = true;
hiloInspector2->pause = true;
empacadora->estaActiva = false;
hiloEmpacadora->pause = true;
if(hilosCarritoSalida != NULL){
for(int i = 0; i < listaGalletas->largoListaGalletas(); i++){
hilosCarritoSalida[i]->pause = true;
}
}
hiloAlmacenTerminal->pause = true;
}
/*
* Pone en pausa todos los hilos, espera a que se sus banderas de seguro se
* activen y despues llama a las funciones resetearEstructura() de todas las
* maquinas.
*/
void Simulacion::resetearSimulacion(){
pausarHilos();
while(!hilosSeguros()){
continue;
}
carritosSalida = NULL;
hilosCarritoSalida = NULL;
bandaMasa->resetearBanda();
bandaChocolate->resetearBanda();
bandaGalletasCrudas->resetearBanda();
bandaInspectores->resetearBanda();
almacenPrima->resetearAlmacen();
carritoEntrega->resetearCarritoEntrega();
mezcladoraChocolate->resetearChocolate();
for(int i = 0; i < 2; i++){
mezcladorasMasa[i]->resetearMasa();}
ensambladora->resetearEnsambladora();
horno->resetearHorno();
for(int j = 0; j < 6; j++){
bandejas[j]->resetearBandeja();
}
inspector1->resetearInspector();
inspector2->resetearInspector();
listaGalletas->resetearListaGalletas();
empacadora->resetearEmpacadora();
almacenTerminal->resetearAlmacen();
}
/*
* Crea las estructuras de todos los carritos de salida, crea un hilo para cada carrito
* e inicisliza todos los hilos.
* Esta funcion se llama despues de se establecen los tipos de empaques de galletas ya
* que los carritos son dependientes de estos.
*/
void Simulacion::crearHilosCarritoSalida(){
carritosSalida = new CarritoSalida*[listaGalletas->largoListaGalletas()];
hilosCarritoSalida = new HiloCarritoSalida*[listaGalletas->largoListaGalletas()];
NodoMonticulo* actualEmpacadora = empacadora->monticulosEmpacadora->primerNodo;
NodoMonticulo* actualAlmacen = almacenTerminal->depositos->primerNodo;
for(int i = 0; i < listaGalletas->largoListaGalletas(); i++){
carritosSalida[i] = new CarritoSalida(actualAlmacen->nombre, actualEmpacadora, actualAlmacen);
HiloCarritoSalida* nuevoHilo = new HiloCarritoSalida(NULL, carritosSalida[i]);
hilosCarritoSalida[i] = nuevoHilo;
nuevoHilo->start();
actualEmpacadora = actualEmpacadora->siguiente;
actualAlmacen = actualAlmacen->siguiente;
}
}
/*
* Salidas:
* Verdadero si todas las banderas de seguro de los hilos estan en verdadero,
* falso de lo contrario.
*
* Revisa que todas las bandera de seguro esten puestas, estas banderas se ac-
* tivan cuando el hilo entra en el ciclo de pausa.
* De esta manera se asegura que las estructuras de los hilos no se reseteen
* si los hilos no estan pausados.
*/
bool Simulacion::hilosSeguros(){
bool seguroBandejas = true;
for(int i = 0; i < 6; i++){
seguroBandejas = seguroBandejas & hilosBandeja[i]->seguro;
}
bool seguroMezcladoras = true;
for(int i = 0; i < 2; i++){
seguroMezcladoras = seguroBandejas & hilosMezcladorasMasa[i]->seguro;
}
bool seguroCarritosSalida = true;
for(int i = 0; i < listaGalletas->largoListaGalletas(); i++){
seguroCarritosSalida = seguroCarritosSalida & hilosCarritoSalida[i]->seguro;
}
return hiloAlmacenTerminal->seguro && hiloCarritoEntrega->seguro && hiloEmpacadora->seguro &&
hiloEnsambladora->seguro && hiloHorno->seguro && hiloInspector1->seguro &&
hiloInspector2->seguro && hiloMezcladoraChocolate->seguro && seguroBandejas &&
seguroMezcladoras && seguroCarritosSalida;
}