Thread in Java CAPITOLO Richiami di gestione di processi

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Thread in Java CAPITOLO 18. 18.1 Richiami di gestione di processi"

Transcript

1 CAPITOLO 18 Thread in Java Usualmente l esecuzione di un programma è sostenuta da un processo. Nella terminologia Java i processi sono denominati thread. Un thread è dunque costituito da un flusso di esecuzione di istruzioni. In molti casi è opportuno disporre di architetture software di tipo multi-thread, sia perché il calcolatore utilizzato può disporre di hardware dotato di più processori, ed essere pertanto in grado di effettuare computazioni indipendenti, sia perché la risoluzione di un particolare problema può essere organizzata in più sottoproblemi paralleli parzialmente separabili e autonomi. Si sottolinea in particolare che nella macchina virtuale di Java, nel seguito denominata JVM, la gestione dei frame costituenti l interfaccia grafica e delle operazioni che in essi hanno luogo è demandata a thread separati, uno per ciascun frame Richiami di gestione di processi Architetture software basate sull esistenza di processi indipendenti sono attuabili in ogni calcolatore purché il suo sistema operativo lo consenta. Ciò avviene in particolare con macchine dotate di sistemi operativi multitasking. In questi sistemi più processi possono coesistere ed interagire tra di loro scambiandosi reciprocamente informazioni. Dal punto di vista del sistema operativo non vi è alcuna differenza sostanziale tra il trattamento dei processi utente e quello dei processi di sistema. Va tuttavia rilevato che la gestione dei processi nei sistemi multitasking è piuttosto delicata, essendo mirata ad ottimizzare le risorse del sistema nella sua globalità. Ciò comporta, in particolare, che la computazione effettuata dai processi attivi nel calcolatore possa essere temporaneamente sospesa o subire modificazioni nella priorità di esecuzione, sia in base alle operazioni definite nei processi medesimi sia in forza di specifiche politiche di gestione previste dal sistema operativo. Con riferimento all ultima osservazione svolta, si consideri che in un sistema multitasking ogni processo può trovarsi sempre in uno solo di tre stati: esecuzione, attesa oppure pronto. In ogni istante un solo processo è in esecuzione, mentre più processi possono trovarsi accodati

2 18 CAPITOLO 18 Figura 18.1 Grafo di transizione tra gli stati di un processo. negli altri stati. Tipicamente il passaggio di un processo da uno stato ad un altro è conseguenza di richieste di operazioni di I/O oppure di completamento di quest ultime. È peraltro possibile che un processo si sospenda autonomamente o venga sospeso al fine di sincronizzarlo con altro processo concorrente. La Figura 18.1 evidenzia il grafo di transizione per gli stati di un processo. Appena creato, il processo è collocato nella coda dei processi pronti, dalla quale è fatto passare in esecuzione dal sistema operativo. Dallo stato di esecuzione il processo può: (a) terminare, venendo rimosso dalla lista dei processi; (b) venire sospeso a seguito di una richiesta di I/O oppure di accesso ad altra risorsa e venire inserito nella coda dei processi in attesa sino a quando tale risorsa non sarà disponibile; (c) venire sospeso su richiesta di altro processo o del sistema operativo ed essere trasferito nella coda dei processi pronti sino a quando non verrà richiesta la sua riattivazione. Dalla coda di attesa il processo viene rimosso in seguito al completamento dell operazione di I/O oppure per essersi liberata la risorsa richiesta, venendo inserito nella lista dei processi pronti per continuare l esecuzione. Nella gestione d insieme dei processi vi sono alcuni aspetti che si presentano critici. Uno di essi, di particolare interesse per gli argomenti trattati nel testo, riguarda la sincronizzazione per l interscambio di dati e la conseguente possibilità di mutua sospensione e successiva riattivazione. Le problematiche connesse non verranno tuttavia trattate nella loro generalità, ma facendo esplicito riferimento all architettura della macchina virtuale di Java I thread di Java In Java i processi vengono chiamati thread e costituiscono dei flussi di esecuzione. Si è già fatto notare che ogni frame è associato ad un proprio thread, il quale è responsabile delle computazioni operate a livello di finestra. Più in generale va detto che la JVM è basata su un architettura multi-thread per la cui gestione è fornita la classe Thread afferente al package java.lang. Il modello di processi usato dalla classe è improntato agli assunti sotto indicati. Ogni oggetto thread è depositario di un identificatore, non necessariamente univoco, il cui uso è limitato ad eventuali operazioni di debugging dell applicazione. Usualmente tale identificatore non è di alcuna utilità nelle applicazioni.

3 THREAD IN JAVA 19 Ogni thread afferisce ad un thread group. L insieme dei gruppi di thread presenti nella macchina Java costituisce una struttura ad albero, con radice data dal system thread group, della cui gestione è responsabile il sistema. Ogni thread possiede una priorità di esecuzione, che è costituita da un numero intero compreso tra 1 e 10 assegnabile al thread in fase di programmazione. Un thread può assumere la connotazione di demone. I demoni peraltro costituiscono processi particolari, le proprietà funzionali dei quali non sono qui trattate in quanto esulano dagli scopi del testo. Per quanto concerne gli stati dei thread la JVM fa proprio il seguente modello: un thread è definito attivo nel caso in cui sia stata lanciata la sua esecuzione e questa non si è ancora completata; è definito inattivo in caso contrario; un thread è definito sospeso nel caso in cui la sua esecuzione sia stata temporaneamente interrotta; lo stato di sospensione potrà essere successivamente eliminato ripristinandone l esecuzione. Tutte le trasformazioni di stato di un thread sono effettuate a seguito dell attivazione di opportuni metodi della classe Thread. Prima di analizzare in dettaglio tali metodi sembra tuttavia opportuno puntualizzare quali siano le più significative funzionalità da essi espletate sui thread: allocazione e inizializzazione: coincide con la creazione dell oggetto della classe Thread che dovrà contenere il modello computazionale del thread e con la definizione del contesto in cui dovrà essere eseguito il processo; in tale fase il thread è inattivo; attivazione: causa l inizio della computazione di pertinenza del thread; il thread diviene attivo; sospensione: causa una (temporanea) interruzione dell esecuzione del thread; il thread passa nello stato di thread attivo ma sospeso; ripristino: causa la riattivazione dell esecuzione del thread sospeso; il thread ritorna nello stato attivo; terminazione forzata: causa una fine anomala nell esecuzione del thread; il thread ritorna nello stato inattivo; distruzione: causa la deallocazione del thread, senza che ciò comporti necessariamente il rilascio delle risorse da esso impegnate. I metodi forniti dalla classe Thread per fronteggiare le operazioni indicate permettono di gestire nel tempo l evoluzione dei singoli thread nella macchina virtuale di Java, ma non intervengono in alcun modo sul modello computazionale da questi sostenuto. Al fine di permettere al programmatore di definire il codice dei propri thread il linguaggio mette a disposizione il metodo run(), definito nell interfaccia Runnable e implementato dalla classe Thread. Tale metodo viene richiamato in fase di attivazione del thread ed è pertanto destinato ad essere riscritto, nelle sottoclassi d applicazione derivate da Thread, con il codice che è proprio del processo computazionale che si intende associare a quest ultime. Nel seguito sono riportati i metodi della classe Thread che rivestono maggior interesse per le applicazioni sviluppate in questo testo.

4 20 CAPITOLO 18 Il primo gruppo di metodi è destinato alla creazione dei thread e alla descrizione del modello computazionale da essi realizzato. Si tratta di metodi di largo impiego da usare ogniqualvolta un thread debba essere implementato. Thread Thread() Thread (Runnable target) void run() Il costruttore Thread() alloca un nuovo thread assegnandogli un identificatore del tipo Thread-n, in cui n è un numero naturale progressivo: tipicamente Thread-0 rappresenta il thread associato al metodo main(). Usato nella sua prima forma, il costruttore è riferito a thread istanziati da sottoclassi della classe Thread, mentre nella seconda forma è riferito a thread costituiti da istanze di classi che implementano l interfaccia Runnable. Il metodo run() permette di specificare il modello computazionale del thread. Se il thread è costruito a partire da una classe implementante l interfaccia Runnable, il metodo run() della classe Thread richiama l omonimo metodo dell oggetto Runnable. Se il thread si origina da una sottoclasse di Thread, tale sottoclasse deve riscrivere il metodo run() della classe Thread. Il gruppo di metodi che seguono permette di definire le priorità e la natura dei thread. Thread void setpriority (int newpriority) int getpriority() void setdaemon (boolean on) boolean isdaemon() Il metodo setpriority() permette di modificare la priorità di un thread. Il valore di priorità assegnato coincide con il minore tra il valore del parametro newpriority e il valore di priorità del thread group a cui il thread appartiene. Viceversa, il metodo get- Priority() restituisce il valore di priorità del thread. Il metodo setdaemon() permette di definire un thread come demone o meno. Il metodo deve essere invocato prima dell attivazione del thread. La JVM termina la sua attività quando i soli thread attivi sono costituiti da demoni. Il metodo isdaemon() permette di controllare se il thread a cui è inoltrato l omonimo messaggio è un thread demone o meno. Quattro metodi erano destinati nella prima versione di Java alla realizzazione delle principali operazioni di cambiamento di stato dei thread che sono state analizzate in precedenza.

5 THREAD IN JAVA 21 Thread void start() void suspend() void resume() void stop() boolean isalive() Il metodo start() induce l esecuzione del thread portandolo nello stato di thread attivo. La macchina virtuale Java richiama il metodo run() del thread. Il metodo suspend() causa la sospensione del thread portandolo nello stato di thread sospeso. L esecuzione del thread potrà essere successivamente ripristinata con il metodo resume(). Il metodo può essere interessato da un eccezione di tipo SecurityException. Il metodo resume() ripristina l esecuzione del thread qualora esso si trovi nello stato di thread attivo ma sospeso. Il metodo può essere interessato da un eccezione di tipo SecurityException. Il metodo stop() forza il thread ad interrompere in modo anomalo la propria esecuzione sollevando un eccezione ThreadDeath. L eccezione deve essere fatta rimbalzare al metodo chiamante perché il thread termini correttamente. Lo stato di attività dei thread è verificabile ricorrendo al metodo isalive(); il metodo controlla se il thread è attivo, ossia se su di esso è stato invocato il metodo start() e il thread non ha ancora raggiunto lo stato di terminazione. I metodi suspend(), resume() e stop() sono stati peraltro rimossi (dichiarati deprecated) nelle versioni successive del linguaggio, in quanto rivelatisi possibili cause di situazioni di deadlock. La sospensione di un thread o la sua terminazione vanno quindi gestite esclusivamente con i metodi del gruppo sotto indicato. Thread static Thread currentthread() static void yield() static void sleep (long millis) void join() Il metodo currentthread() restituisce un riferimento al thread correntemente in esecuzione. È principalmente utilizzato per acquisire informazioni sul thread. Il metodo yield() causa la temporanea sospensione del thread corrente, permettendo ad altri thread in attesa di divenire attivi. Il metodo sleep() causa la sospensione del thread per il numero di millisecondi indicato dal parametro millis. Il metodo join() induce il completamento del thread corrente prima di rendere possibile l attivazione del thread successivo.

6 22 CAPITOLO 18 Due metodi sono infine destinati alle operazioni di deallocazione dei thread. Thread void destroy() private void exit() Il metodo destroy() causa la deallocazione del thread, ma non delle risorse da esso impegnate. Il metodo exit() è usato dal sistema per permettere al thread di effettuare la deallocazione delle proprie risorse Creazione di thread La creazione di un thread può essere espletata in Java seguendo due metodologie: per ereditarietà dalla classe Thread; implementando l interfaccia Runnable. La scelta di una soluzione o dell altra è dettata da preferenze personali e dalle caratteristiche dell applicazione Creazione di sottoclassi Thread Qualora si voglia realizzare un thread sfruttando l omonima classe, è necessario effettuare le seguenti operazioni: costruire una sottoclasse della classe Thread; sovrascrivere il metodo run(). Il metodo run() della sottoclasse fornisce in tal modo il corpo del nuovo thread. Una volta generata la sottoclasse, è possibile: creare un thread per istanza della sottoclasse di pertinenza; eseguire il thread per chiamata del metodo start(), il quale invoca a sua volta il metodo run() Implementazione dell interfaccia Runnable Questa seconda soluzione è preferibile nel caso in cui si vogliano creare thread evitando situazioni che potrebbero condurre a forme di ereditarietà multipla, non ammessa da Java. Le operazioni necessarie sono le seguenti: costruzione di una classe di implementazione per l interfaccia Runnable; sovrascrittura del metodo run(). Anche in questa situazione il metodo run() della classe fornisce il corpo del nuovo thread. Ciò fatto, un thread viene creato: generando un istanza della classe che implementa Runnable; passando tale istanza come parametro del costruttore della classe Thread. Il thread è eseguito per chiamata del metodo start().

7 THREAD IN JAVA Sincronizzazione dei metodi In un sistema multi-thread coesistono in generale molti thread attivi, i quali costituiscono processi in grado di evolvere autonomamente e capaci di inoltrarsi reciprocamente messaggi. La ricezione di un messaggio da parte di un thread comporta l attivazione del metodo corrispondente. Sono dunque possibili situazioni in cui potrebbe essere richiesta la contemporanea esecuzione di due o più metodi di uno stesso thread: uno di essi eseguito per esigenza del thread depositario del metodo, gli altri perché invocati da messaggi inoltrati da thread diversi. Tale situazione può dimostrarsi estremamente critica, dal momento che la richiesta di esecuzione di metodi da thread esterni potrebbe interferire con l esecuzione della computazione del thread destinatario dei messaggi. Se infatti esistono situazioni in cui l alternata esecuzione dei metodi in questione da parte della JVM può essere opportuna, esistono sicuramente situazioni in cui tale alternanza va impedita. Il problema evidenziato è risolvibile fornendo il linguaggio di opportuni dispositivi per la sincronizzazione dei metodi. Sincronizzare due o più metodi, in sostanza, significa garantire che l esecuzione di ciascuno di essi non venga interrotta dall esecuzione dei rimanenti, neppure in caso di temporanea sospensione del thread a cui i metodi appartengono. In Java la sincronizzazione dei metodi è ottenuta mediante l uso del modificatore synchronized. Qualora i metodi di un thread siano dichiarati sincronizzati, l attivazione di uno di essi blocca le richieste di esecuzione dei metodi rimanenti quando inoltrate alla stessa istanza di thread. La situazione è descritta in Figura 18.2, in cui il thread thd1 è istanziato dalla classe ClasseDiThread e attivato con l esecuzione del metodo m1(). Il thread thd2, che inoltra il messaggio thd1.m2(), dovrà attendere il completamento di m1() per ottenere l esecuzione del metodo m2(). Quanto sopra asserito si applica ai metodi d istanza. Il modificatore synchronized può tuttavia essere applicato anche ai metodi di classe. Qualora due o più metodi statici sincronizzati di una stessa classe vengano chiamati da thread diversi, le loro esecuzioni subiscono un processo di serializzazione in modo che nessuno di essi possa essere interrotto dall esecuzione dei rimanenti. Figura 18.2 Sincronizzazione di metodi d istanza.

8 24 CAPITOLO Un esempio di sincronizzazione di metodi La classe Frame_xThread (Scheda 18.4a) fornisce un esempio di sincronizzazione di metodi secondo un modello produttore-consumatore. Si supponga di disporre di otto dischi blu posizionati nella regione di sinistra di un frame, come indicato in Figura 18.3 (a), e di voler raggiungere la configurazione di otto dischi rossi riportata in 18.3 (b). La trasformazione deve avvenire per produzione di dischi blu da rendere disponibili per la trasformazione in corrispondenti dischi rossi. Figura 18.3 Configurazioni iniziale e finale di un frame. Il processo che sottende la trasformazione delle configurazioni è basato su due metodi principali: il metodo produci() e il metodo consuma(). L esempio ha la funzione di mostrare la differenza tra le configurazioni intermedie, necessarie al raggiungimento di quella finale, che possono essere attraversate a seconda che i due metodi citati siano dichiarati synchronized o meno. Le due regioni di tracciatura in cui è suddivisa la finestra grafica sono rispettivamente denominate rgnprod e rgncons, a rappresentazione dello stato del thread causato dai metodi produci() e consuma(): il metodo produci()opera sulla regione rgnprod: esso riduce progressivamente di un unità il numero di dischi presenti nella regione, richiede la tracciatura della nuova configurazione della stessa e si sospende per un secondo; il metodo consuma() opera in modo analogo sulla regione rgncons, incrementando progressivamente di un unità il numero di dischi della regione, richiedendo la tracciatura della nuova configurazione raggiunta e sospendendosi per uno stesso periodo temporale. La sospensione del thread è inserita sia per permettere all osservatore di seguire l evoluzione del processo di trasformazione nella distribuzione dei dischi nelle due regioni, sia per rendere palese il diverso funzionamento dell applicazione quando i metodi produci() e consuma() sono entrambi dichiarati sincronizzati rispetto a quando non lo sono.

9 THREAD IN JAVA 25 La trasformazione complessiva delle configurazioni di dischi nelle due regioni di tracciatura del frame proviene dalla coordinata esecuzione di entrambi i metodi produci() e consuma(). A tale scopo è necessario che l applicazione a ciò preposta generi un thread, lo si denomini th1, da attivare con il comando th1.start() per l esecuzione del metodo consuma() e in seguito invochi il metodo produci() dello stesso thread. Lo schema computazionale complessivamente ottenuto è analogo a quello riportato in Figura 18.2: il thread thd1 con il metodo m1() è sostituito dal thread th1 e dal metodo consuma(), mentre il thread esterno thd2 inoltrante il messaggio thd1.m2() è sostituito dal thread contenente il programma main() dell applicazione e dal messaggio produci(). Le configurazioni ottenute lanciando l applicazione sono diverse a seconda che i metodi produci() e consuma() siano o meno dichiarati entrambi sincronizzati. Nel caso in cui entrambi i metodi siano dichiarati synchronized, il metodo produci(), che è in esecuzione appartenendo al thread del metodo main(), non può essere interrotto neppure nei suoi periodi di sospensione dal metodo consuma() del thread th1. Pertanto inizialmente si assisterà ad una successiva rimozione di dischi dalla regione rgnprod, come riportato in Figura 18.4, sino al raggiungimento della configurazione di Figura Soltanto a questo punto potrà essere attivato il metodo consuma() del thread th1, il quale procederà ad inserire dischi nella regione rgncons, generando la successione di configurazioni di Figura Figura 18.4 Configurazioni parziali generate dal metodo produci().

10 26 CAPITOLO 18 Figura 18.5 Configurazione finale generata dal metodo produci(). Figura 18.6 Configurazioni generate dal metodo consuma(). Qualora uno dei due metodi non sia dichiarato synchronized, produci() e consuma() procederanno autonomamente, alternandosi nella generazione di configurazioni parziali. Il risultato sarà di assistere ad una progressiva eliminazione di dischi blu dalla regione rgnprod e al contestuale inserimento di dischi rossi in rgncons.

11 THREAD IN JAVA 27 Figura 18.7 Configurazioni generate dai metodi produci() e consuma(). Scheda 18.4a - class Argomenti class Frame_xThread Sincronizzazione di metodi su una stessa istanza di thread. Modello implementato: produttore-consumatore. import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.util.*; import javax.swing.*;

12 28 CAPITOLO 18 public class Frame_xThread extends JFrame implements Runnable { private final int ncmax = 8; private final int r2 = 20; private PanThread rgnprod, rgncons; private int cinit_prod = ncmax, cinit_cons = 0; private int cbasex = 20; private int cbasey = 20; public Frame_xThread() { setdefaultcloseoperation (JFrame.EXIT_ON_CLOSE); Container cnt = getcontentpane(); cnt.setbackground (Color.white); cnt.setlayout (new BorderLayout()); settitle ( Produttore - Consumatore ); setbounds (30, 30, 700, 200); rgnprod = new PanThread (cinit_prod); rgnprod.setsize (340, 200); rgnprod.setbackground (Color.yellow); rgnprod.setforeground (Color.blue); cnt.add (rgnprod, West ); rgncons = new PanThread (cinit_cons); rgncons.setsize (340, 200); rgncons.setbackground (Color.cyan); rgncons.setforeground (Color.red); cnt.add (rgncons, East ); Panel controlli = new JPanel(); controlli.setbackground (Color.lightGray); cnt.add (controlli, South ); setvisible (true true); class PanThread extends Canvas { public int ncerchi; public PanThread (int ncerchi) { super(); this.ncerchi = ncerchi; public void paint (Graphics g) { int cx = cbasex; int cy = cbasey; Graphics2D g2 = (Graphics2D) g; for (int c = 0; c < ncerchi; c++) { cx = cx + 2*r2; g2.fill (new Ellipse2D.Duoble (cx, cy, r2, r2)); for (int c = ncerchi + 1; c < ncmax+1; c++) { cx = cx + 2*r2; g2.draw (new Ellipse2D.Duoble (cx, cy, r2, r2));

13 THREAD IN JAVA 29 La classe Frame_xThread dispone di un frame suddiviso in due regioni. Nella regione di sinistra sono collocati otto dischi blu. Il programma realizzato dalla classe comporta l eliminazione dei dischi blu dalla regione sinistra con corrispondente generazione di otto dischi rossi nella regione destra. Il processo che sottende la trasformazione è basato su due metodi principali: il metodo produci() e il metodo consuma(). La trasformazione deve dunque avvenire per produzione di dischi blu da rendere disponibili per la consumazione (trasformazione) in corrispondenti dischi rossi. La classe è realizzata in forma mista, sfruttando sia classi dell architettura AWT sia classi JFC/Swing. La forma complessiva del frame prevede due regioni di tracciatura, istanziate dalla classe PanThread derivata da Canvas, e un sottostante pannello vuoto di classe JPanel inserito per possibili usi successivi. Le due regioni di tracciatura, denominate rgnprod e rgncons, sono destinate a visualizzare i dischi blu e rossi afferenti alle sottofinestre sinistra e destra del frame a mano a mano che il processo evolve. La regione rgnprod è inizializzata con ncmax = 8 dischi blu, mentre la regione rgncons è priva di dischi: le variabili cinit_prod e cinit_cons stabiliscono lo stato iniziale delle due regioni. I colori dei dischi provengono dalla definizione dei colori di foreground delle rispettive regioni, mentre la costante r2 ne stabilisce il diametro. Le variabili cbasex e cbasey definiscono le posizioni dei punti iniziali a partire dai quali saranno collocati i dischi nelle due regioni di tracciatura. Dichiarazione delle variabili private final int ncmax = 8; private final int r2 = 20; private PanThread rgnprod, rgncons; private int cinit_prod = ncmax, cinit_cons = 0; private int cbasex = 20; private int cbasey = 20; Dopo la creazione della finestra grafica, derivata dalla classe JFrame nel modo consueto al contesto JFC/Swing e basata su un modello di distribuzione dei componenti di tipo BorderLayout, la classe crea le regioni rgnprod e rgncons istanziandole dalla classe PanThread e dotandole dei dischi di propria pertinenza. In questa fase il metodo setbackground() assegna alla regione rgnprod uno sfondo giallo e il metodo setforeground() stabilisce per essa il colore di tracciatura blu. I corrispondenti colori della regione rgncons sono il ciano e il rosso. Le due regioni vengono quindi inserite dal metodo add() nelle parti West e East del layout del contenitore cnt del frame. Generazione del frame public Frame_xThread() { rgnprod = new PanThread (cinit_prod); rgnprod.setsize (340, 200); rgnprod.setbackground (Color.yellow); rgnprod.setforeground (Color.blue); cnt.add (rgnprod, West ); rgncons = new PanThread (cinit_cons); rgncons.setsize (340, 200);

14 30 CAPITOLO 18 rgncons.setbackground (Color.cyan); rgncons.setforeground (Color.red); cnt.add (rgncons, East ); Successivamente è creato il pannello controlli, che viene dotato di sfondo grigio e allocato nella parte South del contenitore cnt. L ultima operazione di Frame_xThread() consiste nel rendere visibile il frame con il metodo setvisible(). Completamento del frame public Frame_xThread() { Panel controlli = new JPanel(); controlli.setbackground (Color.lightGray); cnt.add (controlli, South ); setvisible (true true); Il processo di visualizzazione dei dischi nelle due regioni di tracciatura rgnprod e rgncons è realizzato dalla classe interna PanThread. Il costruttore della classe trascrive nella variabile d istanza ncerchi il numero di dischi inizialmente presenti nella regione. Tale valore verrà modificato durante l esecuzione del programma a mano a mano che i dischi verranno trasferiti dalla regione rgnprod alla regione rgncons. Costruttore della classe di visualizzazione public PanThread (int ncerchi) { super(); this.ncerchi = ncerchi; Il metodo paint() utilizza il valore di ncerchi per tracciare a campitura piena, con il metodo fill(), i dischi presenti nella regione su cui è attivato e per disegnare con il metodo draw() il profilo dei dischi mancanti. In tale contesto i valori di cbasex e cbasey definiscono i punti di riferimento iniziali del processo di tracciatura, mentre r2 stabilisce l ampiezza del rettangolo di contenimento dei dischi. Visualizzazione di regione public void paint (Graphics g) { int cx = cbasex; int cy = cbasey; Graphics2D g2 = (Graphics2D) g; for (int c = 0; c < ncerchi; c++) { cx = cx + 2*r2; g2.fill (new Ellipse2D.Duoble (cx, cy, r2, r2)); for (int c = ncerchi + 1; c < ncmax+1; c++) { cx = cx + 2*r2;

15 THREAD IN JAVA 31 g.draw (new Ellipse2D.Duoble (cx, cy, r2, r2)); I metodi della classe Frame_xThread che sottendono alla trasformazione delle configurazioni delle regioni rgnprod e rgncons sono i metodi produci() e consuma(). Il metodo produci() opera sulla regione rgnprod: la chiamata riduce progressivamente di un unità il numero di dischi presenti nella regione, richiede la tracciatura della nuova configurazione della stessa e si sospende per 1000 millisecondi. In modo analogo il metodo consuma() opera sulla regione rgncons, incrementando progressivamente di un unità il numero di dischi della regione, richiedendo la tracciatura della nuova configurazione raggiunta e sospendendosi per uno stesso periodo temporale. public class Frame_xThread extends JFrame implements Runnable { public synchronized void produci() { for (int c = 0; c < ncmax; c++) { rgnprod.ncerchi ; rgnprod.repaint(); try { Thread.sleep (1000); catch (InterruptedException e) { throw new RuntimeException(); public /* synchronized */ void consuma() { for (int c = 0; c < ncmax; c++) { rgncons.ncerchi++; rgncons.repaint(); try { Thread.sleep (1000); catch (InterruptedException e) { throw new RuntimeException(); public void run() { consuma(); La sospensione del thread è ottenuta in entrambi i metodi produci() e consuma() con l uso del metodo statico sleep() della classe Thread, che è utilizzabile dal momento che la classe Frame_xThread implementa l interfaccia Runnable. Si consideri che la sospensione del thread è inserita sia per permettere all osservatore di seguire l evoluzione del processo di trasformazione nella distribuzione dei dischi nelle due regioni, sia per rendere palese il diverso funzionamento dell applicazione quando i metodi produci() e consuma() sono entrambi dichiarati sincronizzati rispetto a quando non lo sono.

16 32 CAPITOLO 18 La classe Frame_xThread è completata dal metodo run() contenente il codice dei thread da essa istanziabili. Come si nota, il thread si limita ad operare una chiamata al metodo consuma() per modificare la regione rgncons della GUI. Codice del thread public class Frame_xThread extends JFrame implements Runnable { public void run() { consuma(); La trasformazione complessiva delle configurazioni di dischi nelle due regioni di tracciatura del frame proviene dalla coordinata esecuzione di entrambi i metodi produci() e consuma(). La classe Pgm_xThread ne implementa la realizzazione. import java.awt.*; public class Pgm_xThread { public static void main (String[] args) { Frame_xThread winthread = new Frame_xThread(); Thread th1 = new Thread (winthread); th1.start(); winthread.produci(); L applicazione genera inizialmente un thread, denominato th1, creando un istanza della classe Frame_xThread e passando l oggetto winthread così istanziato al costruttore Thread() della omonima classe. Generazione thread public static void main (String[] args) { Frame_xThread winthread = new Frame_xThread(); Thread th1 = new Thread (winthread); Il thread th1 viene quindi attivato con il comando th1.start() per l esecuzione del metodo consuma(). Attivazione thread: consuma() public static void main (String[] args) { th1.start(); Infine viene effettuata l attivazione del metodo produci() dello stesso thread inoltrandone la richiesta all istanza winthread della classe Frame_xThread.

17 THREAD IN JAVA 33 Attivazione metodo: produci() public static void main (String[] args) { winthread.produci(); 18.5 Sincronizzazione dei thread Un aspetto importante dei sistemi multi-thread riguarda il trasferimento di dati tra processi diversi. Sull argomento la letteratura riporta numerose tecniche e soluzioni. Indipendentemente dalla metodologia seguita, va sottolineato che lo scambio dati fra thread richiede che gli stessi vengano sottoposti ad una fase di sincronizzazione. La tecnica presentata nel seguito si basa sulla presenza di monitor. Un monitor costituisce una risorsa software che viene condivisa fra i thread operanti lo scambio dati, in modo da forzare gli stessi a sincronizzarsi. La Figura 18.8 riporta due situazioni tipiche. Nella forma più semplice, presentata in Figura 18.8 (a), il monitor funge da sincronizzatore dei thread thd1 e thd2 durante lo scambio dati: la sua funzione è di acquisire il dato trasmesso dal thread mittente e di sospendere quest ultimo sino a che il thread destinatario lo non avrà ricevuto. La situazione è del tutto generalizzabile. A titolo dimostrativo, in Figura 18.8 (b) esistono più thread mittenti, denominati thdp1,, thdpn, e un thread ricevente thdc. In questo caso il monitor acquisisce un dato dal primo thread mittente pronto a trasmettere, ne sospende l attività al pari dei rimanenti thread mittente, così da impedire la sovrapposizione di dati diversi in ingresso, inoltra il dato al thread ricevente thdc dopo averlo risvegliato dal suo eventuale stato di sospensione. Ciò fatto, il monitor si rende disponibile per un successivo scambio dati sospendendo il thread ricevente e risvegliando tutti i thread mittente che erano stati precedentemente sospesi. Le operazioni di cui si è trattato richiedono che il linguaggio di implementazione disponga di primitive in grado di agire sull esecuzione dei thread, forzandone la sospensione e la successiva riattivazione. In Java ciascun oggetto può costituire una risorsa condivisa da più Figura 18.8 Utilizzazione dei monitor per la sincronizzazione di thread.

18 34 CAPITOLO 18 thread, per cui i metodi destinati alla loro sincronizzazione devono essere insiti negli oggetti stessi. Essi entrano quindi di diritto nella classe Object del package java.lang da cui discendono le classi di applicazione. Object void wait() native void wait (long timeout) native void notify() native void notifyall() Il primo metodo fornito dalla classe presiede alle operazioni di sospensione dei thread. Un thread sospeso perde il possesso della risorsa condivisa su cui opera e viene inserito nella coda dei processi in attesa. I metodi wait() sospendono il thread correntemente in esecuzione, facendogli perdere il controllo della risorsa condivisa in quel momento posseduta. I thread sospesi e in attesa del rilascio di una risorsa condivisa possono essere risvegliati da altro thread operante sulla stessa risorsa con il metodo notify() oppure con il metodo notifyall(). I thread così risvegliati competono per riottenere il controllo della risorsa in base alla loro priorità e/o al momento della loro sospensione. Nella seconda forma, il metodo wait() può limitare la sospensione del thread corrente al tempo indicato dal parametro timeout. In entrambe le forme il metodo può sollevare un eccezione di tipo InterruptedException. Due ulteriori metodi sono destinati alle operazioni di risveglio dei thread. Un thread risvegliato è trasferito nella coda dei processi pronti e può competere per ottenere nuovamente il possesso della risorsa condivisa di interesse. Il metodo notify() risveglia un singolo thread che è stato sospeso in attesa del rilascio di una risorsa condivisa. Il thread può ottenere il possesso della risorsa eseguendo un metodo sincronizzato appartenente alla risorsa stessa. Il metodo notifyall() risveglia tutti i thread che sono stati sospesi in attesa del rilascio di una risorsa condivisa. I metodi risvegliati competono per riottenere il controllo della risorsa in base alla loro priorità e/o al momento della loro sospensione Un esempio di sincronizzazione di thread Il problema proposto nel Paragrafo si interessava della sincronizzazione di metodi in un modello di processo denominato produttore-consumatore. Quell esempio può essere generalizzato e completato in riferimento allo scambio dati fra thread diversi. La classe Frame_xThreads (Scheda 18.5a) fornisce un esempio di sincronizzazione di thread per l implementazione di un modello di scambio dati basato su monitor. Due thread produttori di dischi, di colori rispettivi blu e rosso, inoltrano i dischi da essi inizialmente posseduti ad un thread consumatore con cadenze temporali distinte. I thread sono costituiti da istanze delle classi Produttore e Consumatore. Per evitare conflittualità fra i diversi processi, lo scambio dati avviene attraverso una risorsa condivisa costituita da un istanza della classe Monitor. La sua funzione è di sincronizzare le operazioni di trasferimento dei dischi dai due thread produttori verso il thread consumatore.

19 THREAD IN JAVA 35 Figura 18.9 Architettura d insieme dell applicazione. La Figura 18.9 riporta l architettura software complessiva. Ai sottostanti thread produttori e consumatore, che costituiscono il nucleo dell applicazione, è associata un interfaccia grafica ripartita in tre regioni di tracciatura distinte, una per ciascun thread, con il compito di visualizzarne istante per istante lo stato. Si osservi che le diverse componenti software coinvolte nell applicazione sono tutte nettamente separate tra di loro, il che comporta una più semplice progettazione e linearità nella definizione delle classi. La classe principale dell applicazione è ora responsabile solamente della costruzione della GUI, suddivisa nelle tre regioni rgncons, rgnprod1 e rgnprod2, e dei metodi responsabili della visualizzazione dello stato dei diversi thread, mentre le operazioni di basso livello necessarie per la tracciatura dei dischi competono ad una ulteriore classe PanThread derivata da Canvas. Il cuore dell applicazione è costituito dalle classi Produttore e Consumatore, dalle quali sono generati gli omonimi thread, e la classe Monitor da cui istanziare il monitor necessario per la sincronizzazione delle attività dei processi. Il monitor infatti costituisce una risorsa condivisa dai thread produttori e consumatore, che si comporta come un supporto intermedio di trasferimento per i dischi. È basato su due metodi synchronized, denominati ricezione() e rilascio(), il cui funzionamento è l uno il duale dell altro: il metodo ricezione() è invocato dai thread della classe Produttore per inoltrare al monitor i propri dischi, mentre il metodo rilascio() è destinato ai thread della classe Consumatore per ricevere dal monitor i dischi in esso presenti.

20 36 CAPITOLO 18 Scheda 18.5a - class Argomenti class Frame_xThreads Sincronizzazione di thread. Modello implementato: monitor. Classi: Produttore, Consumatore, Monitor. import java.awt.*; import java.awt.event.*; import java.util.*; import java.awt.geom.*; import javax.swing.*; public class Frame_xThreads extends JFrame { private final int RGN_CONS = 0, RGN_PROD1 = 1, RGN_PROD2 = 2; private PanThread rgncons, rgnprod1, rgnprod2; public Frame_xThreads() { setdefaultcloseoperation (JFrame.EXIT_ON_CLOSE); Container cnt = getcontentpane(); cnt.setbackground (Color.white); cnt.setlayout (new BorderLayout()); settitle ( Produttori - Consumatore ); setbounds (30, 30, 700, 500); rgnprod1 = new PanThread(); rgnprod1.setsize (340, 300); rgnprod1.setbackground (Color.yellow); cnt.add (rgnprod1, West ); rgnprod2 = new PanThread(); rgnprod2.setsize (340, 500); rgnprod2.setbackground (Color.yellow); cnt.add (rgnprod2, East ); rgncons = new PanThread(); rgncons.setsize (700, 200); rgncons.setbackground (Color.lightGray); cnt.add (rgncons, South ); setvisible (true true); public void modificaregione (int rgn, int nmaxcerchi, Vector vt) { switch (rgn) { case 0: rgncons.setelements (vt, nmaxcerchi); rgncons.repaint(); break; case 1: rgnprod1.setelements (vt, nmaxcerchi); rgnprod1.repaint(); break; case 2: rgnprod2.setelements (vt, nmaxcerchi); rgnprod2.repaint(); break;

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008. - lezione 14 - Thread in Java

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008. - lezione 14 - Thread in Java Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A. 2007-2008 Alessandro Longheu http://www.diit.unict.it/users/alongheu alessandro.longheu@diit.unict.it - lezione 14 - Thread in Java 1 Cos è un

Dettagli

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati Condizione di sincronizzazione Qualora si voglia realizzare una determinata politica di gestione delle risorse,la decisione se ad

Dettagli

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); }

/** * VETTORE DINAMICO elementi */ private Vector elementi; /** * METODO COSTRUTTORE */ public coda() { elementi=new Vector(); } import java.util.*; class coda * Questa classe contiene tutti i metodi per la gestione della coda * @author D'Ambrosio Giovanni Classe 4D I.T.I.S. Grottaminarda * @version 26/02/2010 * VETTORE DINAMICO

Dettagli

Oggetti Lezione 3. aspetti generali e definizione di classi I

Oggetti Lezione 3. aspetti generali e definizione di classi I Programmazione a Oggetti Lezione 3 Il linguaggio Java: aspetti generali e definizione di classi I Sommario Storia e Motivazioni Definizione di Classi Campi e Metodi Istanziazione di oggetti Introduzione

Dettagli

Il Concetto di Processo

Il Concetto di Processo Processi e Thread Il Concetto di Processo Il processo è un programma in esecuzione. È l unità di esecuzione all interno del S.O. Solitamente, l esecuzione di un processo è sequenziale (le istruzioni vengono

Dettagli

Finestra.java. static String nomicolonne[] = {"ind.","cognome","nome","telefono","e-mail"}; //nomi delle colonne della tabella

Finestra.java. static String nomicolonne[] = {ind.,cognome,nome,telefono,e-mail}; //nomi delle colonne della tabella import java.awt.*; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.windowevent; import java.awt.event.windowlistener; import java.io.*; import java.util.*;

Dettagli

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a. 2009-10. prof.

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a. 2009-10. prof. Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 009-10 prof. Viviana Bono Blocco 9 Metodi statici: passaggio parametri, variabili locali, record

Dettagli

Programmazione di rete in Java

Programmazione di rete in Java Programmazione di rete in Java Reti di calcolatori Una rete di calcolatori è un sistema che permette la condivisione di dati informativi e risorse (sia hardware sia software) tra diversi calcolatori. Lo

Dettagli

Le variabili. Olga Scotti

Le variabili. Olga Scotti Le variabili Olga Scotti Cos è una variabile Le variabili, in un linguaggio di programmazione, sono dei contenitori. Possono essere riempiti con un valore che poi può essere riletto oppure sostituito.

Dettagli

! Programmazione strutturata ! TDA. ! Classi, incapsulamento, ! OO. ! Scambio messaggi, eredità, polimorfismo. ! OO in Java

! Programmazione strutturata ! TDA. ! Classi, incapsulamento, ! OO. ! Scambio messaggi, eredità, polimorfismo. ! OO in Java Riassunto Rassegna API - 1 Stefano Mizzaro Dipartimento di matematica e informatica Università di Udine http://www.dimi.uniud.it/mizzaro/ mizzaro@uniud.it Programmazione, lezione 17 3 maggio 2015! Programmazione

Dettagli

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica Fondamenti di Informatica Algebra di Boole: Concetti di base Fondamenti di Informatica - D. Talia - UNICAL 1 Algebra di Boole E un algebra basata su tre operazioni logiche OR AND NOT Ed operandi che possono

Dettagli

Programmazione Java: Variabili membro, Metodi La parola chiave final

Programmazione Java: Variabili membro, Metodi La parola chiave final Programmazione Java: Variabili membro, Metodi La parola chiave final romina.eramo@univaq.it http://www.di.univaq.it/romina.eramo/tlp Roadmap Definire una classe» Variabili membro» Metodi La parola chiave

Dettagli

Sistemi Operativi Sincronizzazione tra Processi

Sistemi Operativi Sincronizzazione tra Processi Sistemi Operativi Processi Docente: Claudio E. Palazzi cpalazzi@math.unipd.it Crediti per queste slides al Prof. Tullio Vardanega 1 Processi indipendenti possono avanzare concorrentemente senza alcun vincolo

Dettagli

Inter Process Communication. Laboratorio Software 2008-2009 C. Brandolese

Inter Process Communication. Laboratorio Software 2008-2009 C. Brandolese Inter Process Communication Laboratorio Software 2008-2009 C. Brandolese Introduzione Più processi o thread Concorrono alla relaizzazione di una funzione applicativa Devono poter realizzare Sincronizzazione

Dettagli

AA 2006-07 LA RICORSIONE

AA 2006-07 LA RICORSIONE PROGRAMMAZIONE AA 2006-07 LA RICORSIONE AA 2006-07 Prof.ssa A. Lanza - DIB 1/18 LA RICORSIONE Il concetto di ricorsione nasce dalla matematica Una funzione matematica è definita ricorsivamente quando nella

Dettagli

R.Focardi Laboratorio di Ingegneria del Software 6. 1

R.Focardi Laboratorio di Ingegneria del Software 6. 1 Networking Java permette comunicazioni in rete basate sul concetto di socket, che permette di vedere la comunicazione in termini di flusso (stream), in modo analogo all input-output di file, usando Stream

Dettagli

La fase di realizzazione. La fase di realizzazione (cont.) Traduzione in Java del diagramma degli use case

La fase di realizzazione. La fase di realizzazione (cont.) Traduzione in Java del diagramma degli use case Università degli Studi di Roma La Sapienza Corso di Laurea in Ingegneria dell Informazione Sede di Latina Corso di Laurea in Ingegneria dell Informazione Consorzio Nettuno La fase di realizzazione si occupa

Dettagli

UML: Class Diagram. Ing. Orazio Tomarchio Orazio.Tomarchio@diit.unict.it

UML: Class Diagram. Ing. Orazio Tomarchio Orazio.Tomarchio@diit.unict.it UML: Class Diagram Ing. Orazio Tomarchio Orazio.Tomarchio@diit.unict.it Dipartimento di Ingegneria Informatica e delle Telecomunicazioni Università di Catania Class Diagram Forniscono una vista strutturale

Dettagli

Classi ed Oggetti in JAVA

Classi ed Oggetti in JAVA Classi ed Oggetti in JAVA Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dell Informazione Università di Siena Via Roma 56 53100 SIENA Uff. 0577233606 rigutini@dii.unisi.it www.dii.unisi.it/~rigutini/

Dettagli

Introduzione alla Programmazione ad Oggetti in C++

Introduzione alla Programmazione ad Oggetti in C++ Introduzione alla Programmazione ad Oggetti in C++ Lezione 1 Cosa è la Programmazione Orientata agli Oggetti Metodologia per costruire prodotti software di grosse dimensioni che siano affidabili e facilmente

Dettagli

Processi di business sovra-regionali relativi ai sistemi regionali di FSE. Versione 1.0 24 Giugno 2014

Processi di business sovra-regionali relativi ai sistemi regionali di FSE. Versione 1.0 24 Giugno 2014 Processi di business sovra-regionali relativi ai sistemi regionali di FSE Versione 1.0 24 Giugno 2014 1 Indice Indice... 2 Indice delle figure... 3 Indice delle tabelle... 4 Obiettivi del documento...

Dettagli

Abstract Data Type (ADT)

Abstract Data Type (ADT) Abstract Data Type Pag. 1/10 Abstract Data Type (ADT) Iniziamo la nostra trattazione presentando una nozione che ci accompagnerà lungo l intero corso di Laboratorio Algoritmi e Strutture Dati: il Tipo

Dettagli

Le funzionalità di un DBMS

Le funzionalità di un DBMS Le funzionalità di un DBMS Sistemi Informativi L-A Home Page del corso: http://www-db.deis.unibo.it/courses/sil-a/ Versione elettronica: DBMS.pdf Sistemi Informativi L-A DBMS: principali funzionalità Le

Dettagli

Laboratorio di Sistemi Fattoriale di un numero Jsp [Java]

Laboratorio di Sistemi Fattoriale di un numero Jsp [Java] Desideriamo realizzare una applicazione web che ci consenta di calcolare il fattoriale di un numero. L'esercizio in sé non particolarmente difficile, tuttavia esso ci consentirà di affrontare il problema

Dettagli

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C

GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C GUIDA ALLA PROGRAMMAZIONE GRAFICA IN C.:luxx:. PREMESSE In questa guida non verranno trattati i costrutti di flusso, le funzioni, o comunque le caratteristiche del linguaggio, che si danno come presupposte.

Dettagli

Università degli Studi di Parma. Facoltà di Scienze MM. FF. NN. Corso di Laurea in Informatica

Università degli Studi di Parma. Facoltà di Scienze MM. FF. NN. Corso di Laurea in Informatica Università degli Studi di Parma Facoltà di Scienze MM. FF. NN. Corso di Laurea in Informatica A.A. 2007-08 CORSO DI INGEGNERIA DEL SOFTWARE Prof. Giulio Destri http://www.areasp.com (C) 2007 AreaSP for

Dettagli

esercizi Esercizi / problemi

esercizi Esercizi / problemi Sistemi informativi applicati (reti di calcolatori): esercizi 1 Esercizi / problemi 1. Creare un applicazione che calcoli la media aritmetica dei seguenti valori interi: 35, 117, 23 e ne visualizzi il

Dettagli

Descrizioni VHDL Behavioral

Descrizioni VHDL Behavioral 1 Descrizioni VHDL Behavioral In questo capitolo vedremo come la struttura di un sistema digitale è descritto in VHDL utilizzando descrizioni di tipo comportamentale. Outline: process wait statements,

Dettagli

Semplici Algoritmi di Ordinamento

Semplici Algoritmi di Ordinamento Fondamenti di Informatica Semplici Algoritmi di Ordinamento Fondamenti di Informatica - D. Talia - UNICAL 1 Ordinamento di una sequenza di elementi Esistono molti algoritmi di ordinamento. Tutti ricevono

Dettagli

Riferimenti ed Oggetti

Riferimenti ed Oggetti Riferimenti e oggetti Riferimenti ed Oggetti In non si possono definire variabili di tipo oggetto ma solo di tipo riferimento a oggetto. I riferimenti sono assimilabili ai tipi base. Allocazione statica

Dettagli

Inter-Process Communication

Inter-Process Communication Inter-Process Communication C. Baroglio a.a. 2002-2003 1 Introduzione In Unix i processi possono essere sincronizzati utilizzando strutture dati speciali, appartenti al pacchetto IPC (inter-process communication).

Dettagli

Esercitazione 7. Procedure e Funzioni

Esercitazione 7. Procedure e Funzioni Esercitazione 7 Procedure e Funzioni Esercizio Scrivere un programma che memorizza in un array di elementi di tipo double le temperature relative al mese corrente e ne determina la temperatura massima,

Dettagli

CORSO DI ALGORITMI E PROGRAMMAZIONE. JDBC Java DataBase Connectivity

CORSO DI ALGORITMI E PROGRAMMAZIONE. JDBC Java DataBase Connectivity CORSO DI ALGORITMI E PROGRAMMAZIONE JDBC Java DataBase Connectivity Anno Accademico 2002-2003 Accesso remoto al DB Istruzioni SQL Rete DataBase Utente Host client Server di DataBase Host server Accesso

Dettagli

Scuola Specializzazione Istruzione Superiore. Object Oriented Programming (OOP) Introduzione alla programmazione orientata agli oggetti

Scuola Specializzazione Istruzione Superiore. Object Oriented Programming (OOP) Introduzione alla programmazione orientata agli oggetti Scuola Specializzazione Istruzione Superiore Object Oriented Programming (OOP) Introduzione alla programmazione orientata agli oggetti Michele Batocchi ITC Vittorio Emanuele II Perugia A.S. 2007/2008 Introduzione

Dettagli

Corso di Programmazione ad Oggetti

Corso di Programmazione ad Oggetti Corso di Programmazione ad Oggetti Introduzione alla programmazione ad oggetti a.a. 2008/2009 Claudio De Stefano 1 La programmazione modulare Un programma può essere visto come un insieme di moduli che

Dettagli

Fondamenti di Informatica. Dichiarazione, creazione e gestione di array in Java

Fondamenti di Informatica. Dichiarazione, creazione e gestione di array in Java Fondamenti di Informatica Dichiarazione, creazione e gestione di array in Java Array in Java - creazione La creazione fa una inizializzazione implicita: num = new int[10]; con valore 0 per int e double,

Dettagli

Energy Studio Manager Manuale Utente USO DEL SOFTWARE

Energy Studio Manager Manuale Utente USO DEL SOFTWARE Energy Studio Manager Manuale Utente USO DEL SOFTWARE 1 ANALYSIS.EXE IL PROGRAMMA: Una volta aperto il programma e visualizzato uno strumento il programma apparirà come nell esempio seguente: Il programma

Dettagli

Sottoprogrammi: astrazione procedurale

Sottoprogrammi: astrazione procedurale Sottoprogrammi: astrazione procedurale Incapsulamento di un segmento di programma presente = false; j = 0; while ( (j

Dettagli

Ambienti di sviluppo integrato

Ambienti di sviluppo integrato Ambienti di sviluppo integrato Un ambiente di sviluppo integrato (IDE - Integrated Development Environment) è un ambiente software che assiste i programmatori nello sviluppo di programmi Esso è normalmente

Dettagli

PROGRAMMAZIONE ORIENTATA AGLI OGGETTI in C++

PROGRAMMAZIONE ORIENTATA AGLI OGGETTI in C++ PROGRAMMAZIONE ORIENTATA AGLI OGGETTI in C++ Classi ed oggetti. Classi derivate, ereditarietà e polimorfismo. Template Capitoli 12, 13, 14 Luis Joyannes Aguilar. Fondamenti di Programmazione in C++. Algoritmi,

Dettagli

2. GESTIONE DOCUMENTI NON SBN

2. GESTIONE DOCUMENTI NON SBN Istituto centrale per il catalogo unico delle biblioteche italiane e per le informazioni bibliografiche APPLICATIVO SBN-UNIX IN ARCHITETTURA CLIENT/SERVER 2. GESTIONE DOCUMENTI NON SBN Manuale d uso (Versione

Dettagli

Generalizzazione di funzioni e di classi. Macro come funzioni generiche

Generalizzazione di funzioni e di classi. Macro come funzioni generiche Alessio Bechini - Corso di - Generalizzazione di funzioni e di classi Il meccanismo di template Macro come funzioni generiche long longmax(long x, long y) { Possibile soluzione int intmax(int x, int y)

Dettagli

Visibilità dei Membri di una Classe

Visibilità dei Membri di una Classe Visibilità dei Membri di una Classe Lezione 10 Ogni classe definisce un proprio scope racchiude il codice contenuto nella definizione della classe e di tutti i suoi membri ogni metodo della classe definisce

Dettagli

BPEL: Business Process Execution Language

BPEL: Business Process Execution Language Ingegneria dei processi aziendali BPEL: Business Process Execution Language Ghilardi Dario 753708 Manenti Andrea 755454 Docente: Prof. Ernesto Damiani BPEL - definizione Business Process Execution Language

Dettagli

Arduino: Programmazione

Arduino: Programmazione Programmazione formalmente ispirata al linguaggio C da cui deriva. I programmi in ARDUINO sono chiamati Sketch. Un programma è una serie di istruzioni che vengono lette dall alto verso il basso e convertite

Dettagli

APPLICAZIONI SU PIU FILE

APPLICAZIONI SU PIU FILE APPLICAZIONI SU PIU FILE Serve poter sviluppare applicazioni su piú file: - alcune funzioni e alcune definizioni di dati in un file - altre funzioni e dati in file diversi Perché?? 1. Se il programma è

Dettagli

P a s q u a l e t t i V e r o n i c a

P a s q u a l e t t i V e r o n i c a PHP: OOP Pasqualetti Veronica Oggetti Possiamo pensare ad un oggetto come ad un tipo di dato più complesso e personalizzato, non esistente fra i tipi tradizionali di PHP, ma creato da noi. 2 Gli oggetti

Dettagli

Concetto di Funzione e Procedura METODI in Java

Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica - D. Talia - UNICAL 1 Metodi e Sottoprogrammi Mentre in Java tramite le classi e gli oggetti è possibile

Dettagli

Estensione di un servizo di messaggistica per telefonia mobile (per una società di agenti TuCSoN)

Estensione di un servizo di messaggistica per telefonia mobile (per una società di agenti TuCSoN) Estensione di un servizo di messaggistica per telefonia mobile (per una società di agenti TuCSoN) System Overview di Mattia Bargellini 1 CAPITOLO 1 1.1 Introduzione Il seguente progetto intende estendere

Dettagli

Dipartimento di Sistemi e Informatica Università degli Studi di Firenze. Dev-C++ Ing. Michele Banci 27/03/2007 1

Dipartimento di Sistemi e Informatica Università degli Studi di Firenze. Dev-C++ Ing. Michele Banci 27/03/2007 1 Dipartimento di Sistemi e Informatica Università degli Studi di Firenze Dev-C++ Ing. Michele Banci 27/03/2007 1 Utilizzare Dev-C++ Tutti i programmi che seranno realizzati richiedono progetti separati

Dettagli

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori Gli array Array e puntatori Laboratorio di Informatica I un array è un insieme di elementi (valori) avente le seguenti caratteristiche: - un array è ordinato: agli elementi dell array è assegnato un ordine

Dettagli

Universita' di Ferrara Dipartimento di Matematica e Informatica. Algoritmi e Strutture Dati. Rappresentazione concreta di insiemi e Hash table

Universita' di Ferrara Dipartimento di Matematica e Informatica. Algoritmi e Strutture Dati. Rappresentazione concreta di insiemi e Hash table Universita' di Ferrara Dipartimento di Matematica e Informatica Algoritmi e Strutture Dati Rappresentazione concreta di insiemi e Hash table Copyright 2006-2015 by Claudio Salati. Lez. 9a 1 Rappresentazione

Dettagli

Il linguaggio Java. Concetti base. I packages

Il linguaggio Java. Concetti base. I packages Il linguaggio Java I packages Concetti base Un package è una collezione di classi ed interfacce correlate che fornisce uno spazio dei nomi ed un controllo sugli accessi Un package facilita il reperimento

Dettagli

MIPS Instruction Set 2

MIPS Instruction Set 2 Laboratorio di Architettura 15 aprile 2011 1 Architettura Mips 2 Chiamata a Funzione 3 Esercitazione Registri MIPS reference card: http://refcards.com/docs/waetzigj/mips/mipsref.pdf 32 registri general

Dettagli

Le funzioni. Funzioni. Funzioni. Funzioni. Funzioni. Funzioni

Le funzioni. Funzioni. Funzioni. Funzioni. Funzioni. Funzioni Funzioni Le funzioni Con il termine funzione si intende, in generale, un operatore che, applicato a un insieme di operandi, consente di calcolare un risultato, come avviene anche per una funzione matematica

Dettagli

Ricorsione. Corso di Fondamenti di Informatica

Ricorsione. Corso di Fondamenti di Informatica Dipartimento di Informatica e Sistemistica Antonio Ruberti Sapienza Università di Roma Ricorsione Corso di Fondamenti di Informatica Laurea in Ingegneria Informatica (Canale di Ingegneria delle Reti e

Dettagli

GESTIONE DELLA PROCEDURA

GESTIONE DELLA PROCEDURA Manuale di supporto all utilizzo di Sintel per Stazione Appaltante GESTIONE DELLA PROCEDURA Data pubblicazione: 17/06/2015 Pagina 1 di 41 INDICE 1. Introduzione... 3 1.1 Obiettivo e campo di applicazione...

Dettagli

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.

Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni. Le funzioni in C I programmi C sono costituiti da definizioni di variabili e funzioni. Una definizione di funzione ha il seguente formato: tipo-ritornato nome-funzione(lista-parametri) { dichiarazioni

Dettagli

SMS API. Documentazione Tecnica YouSMS SOAP API. YouSMS Evet Limited 2015 http://www.yousms.it

SMS API. Documentazione Tecnica YouSMS SOAP API. YouSMS Evet Limited 2015 http://www.yousms.it SMS API Documentazione Tecnica YouSMS SOAP API YouSMS Evet Limited 2015 http://www.yousms.it INDICE DEI CONTENUTI Introduzione... 2 Autenticazione & Sicurezza... 2 Username e Password... 2 Connessione

Dettagli

Pila.h versione 6. class Pila { private: int marker; int * contenuto; public:

Pila.h versione 6. class Pila { private: int marker; int * contenuto; public: 1 Pila.h versione 6 struct Pila { private: int size; int defaultgrowthsize; int marker; int * contenuto; void cresci(int increment); public: Pila(int initialsize) ; Pila(); ~Pila() ; void copy(pila * to)

Dettagli

FASE DEBUGGING: Compiler Linker. controllando che la voce Genera le informazioni per il debug cioè. "Generate debugging information"

FASE DEBUGGING: Compiler Linker. controllando che la voce Genera le informazioni per il debug cioè. Generate debugging information FASE DEBUGGING: Prima della compilazione, si devono inserire 1 nel progetto informazioni per il debug cioè si devono visualizzare le opzioni di progetto seguendo il percorso: controllando che la voce Genera

Dettagli

I file di dati. Unità didattica D1 1

I file di dati. Unità didattica D1 1 I file di dati Unità didattica D1 1 1) I file sequenziali Utili per la memorizzazione di informazioni testuali Si tratta di strutture organizzate per righe e non per record Non sono adatte per grandi quantità

Dettagli

Elementi di semantica denotazionale ed operazionale

Elementi di semantica denotazionale ed operazionale Elementi di semantica denotazionale ed operazionale 1 Contenuti! sintassi astratta e domini sintattici " un frammento di linguaggio imperativo! semantica denotazionale " domini semantici: valori e stato

Dettagli

Le system call: fork(), wait(), exit()

Le system call: fork(), wait(), exit() Le system call: fork(), wait(), exit() Di seguito viene mostrato un programma che fa uso di puntatori a funzione, nel quale si mette in evidenza il loro utilizzo. Programma A1 #include int add(a,b,c)

Dettagli

1 EJB e Portal Component Object http://desvino.altervista.org

1 EJB e Portal Component Object http://desvino.altervista.org 1 EJB e Portal Component Object http://desvino.altervista.org In questo tutorial studiamo come sfruttare la tecnologia EJB, Enterprise JavaBean, all interno del SAP Netweaver Portal. In breve, EJB è un

Dettagli

GeoGebra 4.2 Introduzione all utilizzo della Vista CAS per il secondo biennio e il quinto anno

GeoGebra 4.2 Introduzione all utilizzo della Vista CAS per il secondo biennio e il quinto anno GeoGebra 4.2 Introduzione all utilizzo della Vista CAS per il secondo biennio e il quinto anno La Vista CAS L ambiente di lavoro Le celle Assegnazione di una variabile o di una funzione / visualizzazione

Dettagli

Quando A e B coincidono una coppia ordinata é determinata anche dalla loro posizione.

Quando A e B coincidono una coppia ordinata é determinata anche dalla loro posizione. Grafi ed Alberi Pag. /26 Grafi ed Alberi In questo capitolo richiameremo i principali concetti di due ADT che ricorreranno puntualmente nel corso della nostra trattazione: i grafi e gli alberi. Naturale

Dettagli

Progetto Istanze On Line

Progetto Istanze On Line 2011 Progetto Istanze On Line 21 febbraio 2011 INDICE 1 INTRODUZIONE ALL USO DELLA GUIDA... 3 1.1 SIMBOLI USATI E DESCRIZIONI... 3 2 PROGETTO ISTANZE ON LINE... 4 2.1 COS È E A CHI È RIVOLTO... 4 2.2 NORMATIVA

Dettagli

Controllare un nastro trasportatore fischertechnik con Arduino

Controllare un nastro trasportatore fischertechnik con Arduino TITOLO ESPERIENZA: Controllare un nastro trasportatore fischertechnik con Arduino PRODOTTI UTILIZZATI: OBIETTIVO: AUTORE: RINGRAZIAMENTI: Interfacciare e controllare un modello di nastro trasportatore

Dettagli

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni client

Luca Mari, Sistemi informativi applicati (reti di calcolatori) appunti delle lezioni. Architetture client/server: applicazioni client Versione 25.4.05 Sistemi informativi applicati (reti di calcolatori): appunti delle lezioni Architetture client/server: applicazioni client 1 Architetture client/server: un esempio World wide web è un

Dettagli

Middleware Laboratory. Dai sistemi concorrenti ai sistemi distribuiti

Middleware Laboratory. Dai sistemi concorrenti ai sistemi distribuiti Dai sistemi concorrenti ai sistemi distribuiti Problemi nei sistemi concorrenti e distribuiti I sistemi concorrenti e distribuiti hanno in comune l ovvio problema di coordinare le varie attività dei differenti

Dettagli

CATTURARE LO SCHERMO INTERO O LA FINESTRA ATTIVA

CATTURARE LO SCHERMO INTERO O LA FINESTRA ATTIVA CATTURARE LO SCHERMO INTERO O LA FINESTRA ATTIVA Supponiamo di voler eseguire una istantanea del nostro desktop, quella che in gergo si chiama Screenshot (da screen, schermo, e shot, scatto fotografico).

Dettagli

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI PROBLEMA DELLA RICERCA in termini generali: Dati in input un insieme S di elementi (numeri, caratteri, stringhe, ) e un elemento

Dettagli

Manuale Software. www.smsend.it

Manuale Software. www.smsend.it Manuale Software www.smsend.it 1 INTRODUZIONE 3 Multilanguage 4 PANNELLO DI CONTROLLO 5 Start page 6 Profilo 7 Ordini 8 Acquista Ricarica 9 Coupon AdWords 10 Pec e Domini 11 MESSAGGI 12 Invio singolo sms

Dettagli

Manuale Operativo IL SOFTWARE PER LA GESTIONE CENTRALIZZATA DEL SISTEMA DELLE SEGNALAZIONI E DEI RECLAMI DELL ENTE

Manuale Operativo IL SOFTWARE PER LA GESTIONE CENTRALIZZATA DEL SISTEMA DELLE SEGNALAZIONI E DEI RECLAMI DELL ENTE Manuale Operativo IL SOFTWARE PER LA GESTIONE CENTRALIZZATA DEL SISTEMA DELLE SEGNALAZIONI E DEI RECLAMI DELL ENTE Il presente documento applica il Regolamento sulla gestione delle segnalazioni e dei reclami

Dettagli

Guida. Vista Live. Controllo. Riproduzione su 24 ore. Ricerca avanz. Le icone includono: Mod. uscita. Icona. Un sensore di allarme.

Guida. Vista Live. Controllo. Riproduzione su 24 ore. Ricerca avanz. Le icone includono: Mod. uscita. Icona. Un sensore di allarme. Guida operatore del registratore TruVision Vista Live Sull immagine live dello schermo vengono visualizzati laa data e l ora corrente, il nome della telecamera e viene indicato se è in corso la registrazione.

Dettagli

DOCUMENTO APPROVATO DAL CONSIGLIO DI AMMINISTRAZIONE DEL 12 DICEMBRE

DOCUMENTO APPROVATO DAL CONSIGLIO DI AMMINISTRAZIONE DEL 12 DICEMBRE REGOLAMENTO DI FUNZIONAMENTO DELL ORGANISMO DI VIGILANZA D.LGS 231/01 DI GALA S.P.A. DOCUMENTO APPROVATO DAL CONSIGLIO DI AMMINISTRAZIONE DEL 12 DICEMBRE 2013 INDICE ARTICOLO 1 SCOPO E AMBITO DI APPLICAZIONE..3

Dettagli

Introduzione agli algoritmi e alla programmazione in VisualBasic.Net

Introduzione agli algoritmi e alla programmazione in VisualBasic.Net Lezione 1 Introduzione agli algoritmi e alla programmazione in VisualBasic.Net Definizione di utente e di programmatore L utente è qualsiasi persona che usa il computer anche se non è in grado di programmarlo

Dettagli

Guida ai Servizi Internet per il Referente Aziendale

Guida ai Servizi Internet per il Referente Aziendale Guida ai Servizi Internet per il Referente Aziendale Indice Indice Introduzione...3 Guida al primo accesso...3 Accessi successivi...5 Amministrazione dei servizi avanzati (VAS)...6 Attivazione dei VAS...7

Dettagli

Struttura di un programma Java. Package. Uso dei package

Struttura di un programma Java. Package. Uso dei package Università degli Studi di Roma La Sapienza Corso di Laurea in Ingegneria dell Informazione (sede di Latina) Corso di Laurea in Ingegneria dell Informazione (consorzio Nettuno) Struttura di un programma

Dettagli

Un oggetto per la lettura dalla tastiera

Un oggetto per la lettura dalla tastiera Fondamenti di informatica Oggetti e Java ottobre 2012 1 Un oggetto per la lettura dalla tastiera Le API di Java hanno un oggetto System.in che rappresenta la tastiera del calcolatore, ma che non è semplice

Dettagli

FIRESHOP.NET. Gestione Utility & Configurazioni. Rev. 2014.3.1 www.firesoft.it

FIRESHOP.NET. Gestione Utility & Configurazioni. Rev. 2014.3.1 www.firesoft.it FIRESHOP.NET Gestione Utility & Configurazioni Rev. 2014.3.1 www.firesoft.it Sommario SOMMARIO Introduzione... 4 Impostare i dati della propria azienda... 5 Aggiornare il programma... 6 Controllare l integrità

Dettagli

MIB PER IL CONTROLLO DELLO STATO DI UN SERVER FTP

MIB PER IL CONTROLLO DELLO STATO DI UN SERVER FTP Università degli Studi di Pisa Facoltà di Scienze Matematiche,Fisiche e Naturali Corso di Laurea in Informatica Michela Chiucini MIB PER IL CONTROLLO DELLO STATO DI UN SERVER

Dettagli

Appunti di Sistemi Operativi. Enzo Mumolo e-mail address :mumolo@units.it web address :www.units.it/mumolo

Appunti di Sistemi Operativi. Enzo Mumolo e-mail address :mumolo@units.it web address :www.units.it/mumolo Appunti di Sistemi Operativi Enzo Mumolo e-mail address :mumolo@units.it web address :www.units.it/mumolo Indice 1 Cenni su alcuni algoritmi del Kernel di Unix 1 1.1 Elementi di Unix Internals.................................

Dettagli

Gestione dei File in C

Gestione dei File in C Gestione dei File in C Maurizio Palesi DIIT Università di Catania Viale Andrea Doria 6, 95125 Catania mpalesi@diit.unict.it http://www.diit.unict.it/users/mpalesi Sommario In questo documento saranno introdotte

Dettagli

Introduzione alle applicazioni di rete

Introduzione alle applicazioni di rete Introduzione alle applicazioni di rete Definizioni base Modelli client-server e peer-to-peer Socket API Scelta del tipo di servizio Indirizzamento dei processi Identificazione di un servizio Concorrenza

Dettagli

Boot Camp Guida all installazione e alla configurazione

Boot Camp Guida all installazione e alla configurazione Boot Camp Guida all installazione e alla configurazione Indice 4 Introduzione 5 Cosa ti occorre 6 Panoramica dell installazione 6 Passo 1: verifica la presenza di aggiornamenti. 6 Passo 2: apri Assistente

Dettagli

INFORMATIVA FINANZIARIA

INFORMATIVA FINANZIARIA Capitolo 10 INFORMATIVA FINANZIARIA In questa sezione sono riportate le quotazioni e le informazioni relative ai titoli inseriti nella SELEZIONE PERSONALE attiva.tramite la funzione RICERCA TITOLI è possibile

Dettagli

Introduzione al linguaggio C Gli array

Introduzione al linguaggio C Gli array Introduzione al linguaggio C Gli array Vettori nome del vettore (tutti gli elementi hanno lo stesso nome, c) Vettore (Array) Gruppo di posizioni (o locazioni di memoria) consecutive Hanno lo stesso nome

Dettagli

Esercizi Capitolo 5 - Alberi

Esercizi Capitolo 5 - Alberi Esercizi Capitolo 5 - Alberi Alberto Montresor 19 Agosto, 2014 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile saltare alle

Dettagli

Serduino - SERRA CON ARDUINO

Serduino - SERRA CON ARDUINO Serduino - SERRA CON ARDUINO 1 Componenti Facchini Riccardo (responsabile parte hardware) Guglielmetti Andrea (responsabile parte software) Laurenti Lorenzo (progettazione hardware) Rigolli Andrea (reparto

Dettagli

Le Liste. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Le Liste 1 / 31

Le Liste. Elisa Marengo. Università degli Studi di Torino Dipartimento di Informatica. Elisa Marengo (UNITO) Le Liste 1 / 31 Le Liste Elisa Marengo Università degli Studi di Torino Dipartimento di Informatica Elisa Marengo (UNITO) Le Liste 1 / 31 Cos è una Lista Una lista è una collezione di elementi omogenei che: potrebbero

Dettagli

PROCEDURA DI AUDIT AI TEST CENTER AICA

PROCEDURA DI AUDIT AI TEST CENTER AICA Pag. 1 di 14 PROCEDURA DI AUDIT REVISIONI 1 19/12/2002 Prima revisione 2 07/01/2004 Seconda revisione 3 11/01/2005 Terza revisione 4 12/01/2006 Quarta revisione 5 09/12/2013 Quinta revisione Adeguamenti

Dettagli

[05/05/2008 NOTA 11] Le note sono elencate dalla più recente alla meno recente.

[05/05/2008 NOTA 11] Le note sono elencate dalla più recente alla meno recente. Questo documento riporta delle note integrative ai documenti di riferimento della Posta Elettronica Certificata (PEC). Nello specifico le seguenti note fanno riferimento a: Decreto del Presidente della

Dettagli

Ultimo aggiornamento avvenuto il 18 giugno 2014. Sostituisce la versione del 2 maggio 2013 nella sua interezza.

Ultimo aggiornamento avvenuto il 18 giugno 2014. Sostituisce la versione del 2 maggio 2013 nella sua interezza. Condizioni di utilizzo aggiuntive di Acrobat.com Ultimo aggiornamento avvenuto il 18 giugno 2014. Sostituisce la versione del 2 maggio 2013 nella sua interezza. SERVIZI ONLINE ADOBE RESI DISPONIBILI SU

Dettagli

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)

Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1) Strutture Strutture e Unioni DD cap.10 pp.379-391, 405-406 KP cap. 9 pp.361-379 Strutture Collezioni di variabili correlate (aggregati) sotto un unico nome Possono contenere variabili con diversi nomi

Dettagli

8. L'USO DEL PROGRAMMA DI POSTA ELETTRONICA INSIEME ALLA GESTIONE PROFESSIONALE DI DOCUMENTI IN FORMATO E-MAIL

8. L'USO DEL PROGRAMMA DI POSTA ELETTRONICA INSIEME ALLA GESTIONE PROFESSIONALE DI DOCUMENTI IN FORMATO E-MAIL This project funded by Leonardo da Vinci has been carried out with the support of the European Community. The content of this project does not necessarily reflect the position of the European Community

Dettagli

DynDevice ECM. La Suite di applicazioni web per velocizzare, standardizzare e ottimizzare il flusso delle informazioni aziendali

DynDevice ECM. La Suite di applicazioni web per velocizzare, standardizzare e ottimizzare il flusso delle informazioni aziendali DynDevice ECM La Suite di applicazioni web per velocizzare, standardizzare e ottimizzare il flusso delle informazioni aziendali Presentazione DynDevice ECM Cos è DynDevice ICMS Le soluzioni di DynDevice

Dettagli

Gestione Email Gruppo RAS Carrozzerie Convenzionate

Gestione Email Gruppo RAS Carrozzerie Convenzionate Email Ras - CARROZZIERI Pag. 1 di 17 Gestione Email Gruppo RAS Carrozzerie Convenzionate Notizie Generali Email Ras - CARROZZIERI Pag. 2 di 17 1.1 Protocollo Gruppo RAS Questo opuscolo e riferito al Protocollo

Dettagli