Le occorrenze sono uno strumento molto utile nella sincronizzazione di processi e nella programmazione a eventi. Si sottolinea come l’utilizzo della programmazione a eventi combinata con le occorrenze evita la necessità di polling (un ciclo che viene eseguito continuamente in attesa di un evento).

L’utilizzo  si basa sulla creazione di una reference, quindi il wait on occurrence (WoO) attende finchè da non ci sia una richiesta di  set occurrence.

Se il terminale ms timeout viene impostato a -1, rimane in attesa solo dell’evento Set Occurence(no polling); settando ad un valore >-1 viene eseguito comunque il codice allo scadere del tempo di timeout impostato.

La WoO ha anche un  terminale ignore previous (true) che se impostato a true, non considera una richiesta di set occurence avvenuta prima della esecuzione della WoO, nel caso sia false invece considera un occorrenza settata prima di eseguire il WoO. Si può usare la funzione first call? Per impostare a true (ignora precedenti) alla prima esecuzione e poi passa a false nei loop successivi.

Un caso d’uso molto frequente (vedi articolo quando occorre l’occorrenza http://www.agilesystems.it/?p=20) è quello di avere la necessità di forzare l’uscita da un ciclo in esecuzione impostato con un timer mollto alto. Utilizzando un while loop con un timer impostato a 10000ms non si può terminare se non terminano i 10 sec. , con le occorrenze invece la richiesta di set scatena una forzatura di uscita immediata.

Il caso appena descritto usa la richiesta continua ad ogni #ms (polling) , se si vuole usare una modalità ad interrupt si può sfruttare una event case nel loop che deve settare l’occorenza e come detto impostare a -1 il terminale ms timeout della WoO.

Uso di occurence tra vi diversi.

Per utilizzare il meccanismo per sincronizzare due vi, si deve rendere disponibile la reference dell’occurence sui due vi.

Con type cast si può ottenere il numero integer corrispondente alla reference.

Le occurence possono essere utilizzate per sincronizzare anche vi chiamati in memoria mediante vi-server o vi con eventi dinamici.

Per rendere disponibile la occurence reference si può utilizzare una functional global, che al primo avvio crea la reference quindi la memorizza in uno shift register.

Con questo meccanismo si può sincronizzare due vi server-client.

client attende che il server setti l’occorrenza a true.

Il server viene gestito mediante una event structure, così entrambi i vi non eseguono polling.

Uso di occurrence vantaggi:

Programmazione completamente priva di polling.

Non serve più la local variable per sincronizzare i while loop.

Utilizzo di latch nei pulsanti di stop loop (in quanto non sono più legati a variabili locali).

Utilizzo di cicli timer molto lunghi con possibilità di interruzione su richiesta.

Sincronizzazione di vi chiamati dinamicamente.