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.

Módulo

G77_SEMAFOROS

Parámetros

Ver también

Ejemplo

VAR
        contador, idReg, Puesto: entero;
        (...)
 
INICIO
 
        // Configuración de los semáforos
        IniSemaforos('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 pedido
        NuevoRegistro('PEDIDOS', idReg);
        AsignarValorRegistro(idReg, 'C1', Contador);
        (...)
        GrabarRegistro(idReg);
        LiberarRegistro(idReg);
 
FIN.