procedimiento CambiaSemaforo (
Semaforo: cadena;
NuevoEstado: TEstadoSemaforo);
Permite
poner un semáforo virtual en rojo mientras se realiza una determinada operación
que requiere exclusividad y permite poner el semáforo en verde al finalizar. |
Este
procedimiento proporciona un método de fácil uso que garantiza que una
determinada operación no podrá ser realizada a la vez desde dos o más puestos de
trabajo. Un ejemplo de este tipo de operaciones son los contadores (de pedidos
o de cualquier otra índole) para los que se debe garantizar que no haya números
repetidos.
Este método
se basa en lo siguiente:
(1) Se
crear un fichero de semáforos tal y como se explica en el procedimiento IniSemaforos.
(2) Se
registra el anterior fichero utilizando el procedimiento IniSemaforos.
(3) Se
decide un nombre para el semáforo (para cada operación exclusiva que pueda
realizarse debe decidirse un nombre de semáforo distinto). La longitud de este
nombre no debe superar la del campo indicado por el parámetro CampoSemaforo
del procedimiento IniSemaforos.
(4) Antes
de realizar la operación exclusiva, se pone el semáforo en rojo llamando a este
procedimiento de la siguiente forma:
CambiaSemaforo(Nombre_Semáforo, SmfRojo);
La
anterior hace lo siguiente:
* Si el semáforo está en verde, lo pone en rojo y termina.
* Si el semáforo está en rojo, espera a que esté en verde,
comprobando si ya está en verde cada vez que transcurre el tiempo indicado por
el parámetro TiempoReintento del procedimiento IniSemaforos. Una vez está en verde,
lo pone en rojo y termina.
* Si mientras espera a que el semáforo se ponga en verde
transcurre un tiempo superior al indicado por el parámetro TiempoEspera
del procedimiento IniSemaforos,
entonces entiende que se trata de un semáforo que se quedó en rojo al finalizar
la ejecución del puesto que lo puso en rojo de forma inesperada, por lo que lo
anula, lo pone en rojo y termina.
(5) Con
el semáforo ya en rojo, se realiza la operación (se lee e incrementa el
contador, etc.).
(6) Una
vez terminada la operación, se pone el semáforo en verde:
CambiaSemaforo(Nombre_Semáforo, SmfVerde);
Ten en cuenta: Sólo se puede poner en verde un semáforo que previamente
haya sido puesto en rojo por ese mismo puesto de trabajo. Si se intenta poner
en verde un semáforo que previamente no se puso en rojo por el puesto de
trabajo, se provoca una excepción.
G77_SEMAFOROS
VAR contador, idReg, Puesto: entero; (...) INICIO // Configuración de los semáforosIniSemaforos('BLOQUEOS', 'C1', 'C2', falso, 100, 5000); (...) // Calcular próximo número de pedido, incrementar el contador y guardarlo. // Se usa el semáforo CONTADORPEDIDOS para que dos puestos no puedan nunca // realizar esta operación a la vez y así no pueda haber números de pedido // repetidos.CambiaSemaforo('CONTADORGENERAL', SmfRojo); Contador := ValorTablaCampanya('CONTADORES', 'C2', 'C1', 'CONTADORPEDIDOS'); inc(Contador); AsignarValorTablaCampanya('CONTADORES', 'C2', Contador, 'C1', 'CONTADORPEDIDOS'); CambiaSemaforo('CONTADORGENERAL', SmfVerde); // Grabar pedidoNuevoRegistro('PEDIDOS', idReg); AsignarValorRegistro(idReg, 'C1', Contador); (...) GrabarRegistro(idReg); LiberarRegistro(idReg); FIN. |