Newsgroup: it.comp.lang.visual-basic
Titolo: [?] VB e Macchine di stato.

applicazioni ed abbia voglia di parlarne?
Emmm... scusa l'ignoranza.
Per macchine di stato, intendi gli automi? tipo:
dim Stato$
sub Evento(TipoEvento$)
select case Stato
case "pippo"
   if TipoEvento$="UNO" then Stato="pluto"
case "pluto"
   if TipoEvento$="DUE" then Stato="paperino"
case "paperino"
   if TipoEvento$="TRE" then Stato="topolino"
case "topolino"
   if TipoEvento$="4" then Stato="pippo"
end select
end sub
Ciao
By -MES-   Maronese Ettore
http://www.maronese.com/mes
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb

 end sub
Iess...
"state machines theory - a technique so powerful that it may change the way
you program forever." (D. Appleman)
Anche se, credo, riguardo il tuo esempio, lo stato della macchina non
dovrebbe essere noto al suo esterno, o per lo meno non modificabile fuori di
essa.
E' appunto su dubbi di questo tipo che mi piacerebbe confrontarmi, non tanto
con una discussione a livello teorico (mi manca la preparazione eppoi
basterebbe studiare qualche buon testo, penso) quanto sulla implementazione
pratica in VB.
In sintesi: qualcuno ne fa uso? se si', in maniera sistematica? in maniera
estensiva, radicale o limitata ad alcuni stati critici? c'e' una letteratura
in proposito? si hanno o meno benefici? ecc.
Gli unici esempi in VB, ripeto e sottolineo, in VB, non altri linguaggi o
ambiti, che io conosca sono il programma di esempio a corredo di VB3,
IconWorks, e cio' che ne dicono D. Kurata in _Doing Obj in MS VB_ ed il gia'
citato D. Appleman in _VB P's Guide Win32 API_.
--
Ciao.
Maurizio




essa.
Ok.
Personalmente li uso abbastanza spesso, ma non farmi domande di teoria xche'
non ho mai letto nulla sull'argomento.
Le Macchine Di Stato (io li chiamo Automi, anche se non sono certo
dell'esattezza del termine) hanno un utilizzo piuttosto di settore, ben
difficilmente si implementano automi sviluppando gestionali, mentre il loro
utilizzo e' pressoche' d'obbligo nelle applicazioni RealTime tipo controllo
di processo (di produzione industriale) e protocolli di comunicazione.
Gli automi sono molto efficenti, ma difficilotti da implementare. Un'automa
ben fatto, in qualsiasi stato sia, e' sempre in grado di gestire al meglio
gli Eventi che possono capitare.
In qualsiasi caso, un automa controlla UNA BEN DETERMINATA COSA. Mi spiego
meglio facendoti un esempio pratico.
Mi e' capitato di dover fare un programma che gestiva un applicatore
pneumatico di etichette, ma il programma doveva tenere sotto controllo
diverse cose, ossia:
- COMUNICAZIONE, La comunicazione con la linea di produzione, tramite
seriale
- STAMPA, La sequenza di stampa dell'etichetta, che doveva essere fatta
interagendo con un secondo programma.
- APPLICAZIONE, Tutta la sequenza di applicazione, fatta interagendo con una
scheda di I/O digitale
- PALLET, La gestione del pallet che doveva essere etichettato, interagendo
con una scheda di I/O digitale
Il programma lo quindi strutturato con 4 automi, ognuno che tiene sotto
controllo un aspetto ben particolare della sequenza.
PALLET, e' quello che tiene sotto controllo TUTTA la sequenza, ed iteragisce
con COMUNICAZIONE e con APPLICATORE.
APPLICATORE interagisce con STAMPA
STAMPA e COMUNICAZIONE si limitano a guardare le loro cose.
Inoltre per dare all'utente la possibilita' di controllare manualmente gli
automi, l'automa PALLET e' fatto per accettare comandi dall'utente.
Il punto di contatto tra un'automa e l'altro e' uno "Stato" che l'automa
mette pubblico (che' e' un sottoinsieme degli stati assumibili dall'automa)
ed il parametro "Evento" della funzione dell'automa che viene usato per
impartire comandi.
(poi il tutto e' stato corredato con la gestione dei timeouts ed altre cose
varie)
Questa architettura e' piuttosto incasinata da implementare (molto
incasinata), xro' non trovai nulla di piu' semplice ed altrettanto
efficiente.
In merito alla implementazione, creo sempre una funzione che accetta in
ingresso uno parametro che rappresenta l'evento accaduto, e se necessario,
un secondo parametro che e' il parametro dell'evento (es:
evento=POSIZIONE_CARRELLO parametro=102.6).
L'automa e' realizzato con ladirettiva  SELECT CASE, esattamente come
lesempietto della scorsa mail.
Se vuoi altre info su come li uso o li implemento, sono qua.
