4D v16 R6 introduce un nuovo concetto di comunicazione tra i processi: le variabili oggetto e collezione condivise! Si tratta di una soluzione che consente di evitare l’uso di variabili interprocesso (che non possono essere utilizzate in modalità multi-thread). Grazie a ciò, sarà possibile condividere facilmente le informazioni tra processi preemptive.
Nuovo concetto: oggetti condivisi / collezioni
Nel mondo della programmazione informatica, quando si ha bisogno di prestazioni, meno si condividono i dati, più si è efficienti. Ma naturalmente, nella maggior parte dei casi i processi creati devono comunicare tra loro. Per inviare parametri, ottenere risultati o semplicemente per accedere a informazioni condivise. Questo è il motivo per cui sono stati creati gli oggetti condivisi e le raccolte condivise! (Ricordiamo che gli oggetti e le collezioni normali non possono essere condivisi tra i processi. Quando vengono passati come parametri, viene creata una copia degli oggetti).
Glioggetti condivisi e le raccolte condivise si comportano come quelli standard, ma devono essere dichiarati come “condivisi” durante la loro istanziazione con i seguenti nuovi comandi: Nuovo oggetto condiviso e Nuova collezione condivisa. Una volta istanziati, possono essere utilizzati direttamente, come tutti gli altri, per la lettura. Non è necessario alcun semaforo o altro, basta usare gli oggetti condivisi.
Per scrivere o modificare, gli oggetti condivisi devono essere circondati dalle parole chiave Use e End use. Queste parole chiave impostano i semafori interni e devono essere utilizzate per accedere al contenuto di oggetti e collezioni in modalità di scrittura. L’uso di queste parole chiave è davvero semplice, molto più semplice dei semafori del linguaggio 4D. Come mai? Non si può dimenticare di liberarle. Use e End use circondano sempre le variabili, quindi non si può dimenticare di rilasciare il blocco.
$object:=New shared object
$ps:=New process("my process";0; "myprocess";$object) // inviato come riferimento
Use ($object)
$object .myAttribute:=10
End use
Come usarli in altri processi?
Vi starete chiedendo: Come posso utilizzare un oggetto condiviso da un altro processo (in modo diverso dall’invio di un parametro)? Come posso condividere senza variabili interprocesso?
Un oggetto “supercondiviso” risolve questo problema. Un nuovo comando, Storage, consente di accedere a questo oggetto per tutti i processi in esecuzione.
Questo oggetto è unico su ogni macchina. Uno (in modalità utente singolo), altrimenti uno per client e uno sul server. Il comando Storage restituisce l’oggetto condiviso, che può essere manipolato come qualsiasi altro oggetto condiviso, ma può contenere solo oggetti condivisi o collezioni condivise. (Si noti che anche i componenti possono contenere Storage ).
Use (Storage)
Storage .myCollection:=New shared collection
End use
Vantaggi
Glioggetti condivisi e le raccolte condivise presentano molti vantaggi rispetto alle variabili interprocesso standard, quali:
- nessuna necessità di protezione in lettura: accesso veloce
- Le parole chiave Use e End Use evitano errori di codifica che possono portare a situazioni di deadlock.
- poiché gli oggetti o le collezioni sono solitamente gerarchici (contengono altri oggetti o collezioni), bloccando un oggetto si blocca l’intera catena in una sola volta, migliorando le prestazioni.
Vi abituerete rapidamente agli oggetti e alle collezioni condivise e diventerà un modo naturale di programmare 🙂