Una transizione della macchina di stato può dipendere dallo stato precedente?

1

Mi chiedevo quale sarebbe stata la macchina di stato per un video player.

Posso pensare a due stati: giocare e mettere in pausa.

  • Quando il video è in riproduzione e l'utente fa clic su un punto nella barra di avanzamento, il video viene messo in pausa (il lettore video passa dallo stato di riproduzione allo stato di pausa) finché l'utente non smette di premere il pulsante del mouse. Quando il mouse viene rilasciato, il video riprende a suonare dal punto selezionato (il video player passa dallo stato di pausa allo stato di riproduzione).
  • Tuttavia, se il video è stato messo in pausa prima che l'utente abbia fatto clic sulla barra di avanzamento, il video salta al punto specificato ma non inizia la riproduzione (il lettore video rimane nello stato di pausa).

Le transizioni di stato sarebbero:

in riproduzione (fai clic sulla barra di avanzamento) - > in pausa (clic finale sulla barra di avanzamento) - > riproduzione in pausa (fai clic sulla barra di avanzamento) - > in pausa (clic finale sulla barra di avanzamento) - > in pausa

Se esisteva un metodo per modificare la posizione del video nello stato di pausa, chiamare quel metodo comporterebbe uno stato diverso a seconda dello stato precedente. Mi stavo chiedendo se esiste un progetto di macchina a stati alterni per un video player in cui le transizioni da ogni stato non dipendono da nessuno stato precedente.

    
posta Danial Masood 02.10.2018 - 20:21
fonte

2 risposte

8

Se vuoi tenere su macchine di stato "classiche" le cui funzioni di transizione dipendono solo dallo stato corrente e dagli input in entrata, devi riconsiderare il modo in cui vuoi modellare lo stato dell'applicazione.

Formalmente, puoi simulare le transizioni a seconda dello stato precedente (in termini della tua attuale applicazione) costruendo una nuova macchina a stati che ha stati di coppia con ogni coppia contenente combinazioni di due degli stati della macchina di stato originale. Concettualmente uno dei componenti della coppia rappresenta il tuo attuale stato principale mentre l'altro descrive lo stato precedente.

Per ogni transizione originale t dallo stato x allo stato y otterrai transizioni t' da qualsiasi stato della forma (*, x) allo stato (x, y) (qui il primo componente codifica il precedente stato principale).

Quindi modifica la macchina di stato risultante in base alle tue esigenze in modo tale da utilizzare effettivamente lo stato principale precedente (primo componente).

Puoi ridurre questa "macchina dello stato del prodotto" eliminando stati / combinazioni impossibili da raggiungere o comprimendo insiemi di stati (*,s) che sono equivalenti per quanto riguarda le transizioni in entrata e in uscita verso i singoli stati.

Forse nel tuo caso puoi introdurre direttamente alcuni stati coppia invece di passare attraverso l'intera cerimonia formale. Fai solo attenzione a considerare tutte le combinazioni importanti.

Nel tuo esempio la macchina a stati risultante non è molto diversa da quella originale. Alcuni degli stati e delle transizioni che potresti ottenere da una tale costruzione sono (ora con (x,y) scritto come x_y ):

playing  --(mousedown)-->  playing_paused  --(mouseup)-->  playing
paused   --(mousedown)-->  paused_paused   --(mouseup)-->  paused

Nota come lo stato di destinazione su mouseup eventi allo stato medio paused differisce, a seconda dello stato precedente codificato.

    
risposta data 02.10.2018 - 21:04
fonte
1

Di solito, lo stato successivo s i +1 in una macchina a stati finiti è completamente definito da uno stato corrente s i e un segnale in entrata m . In altre parole:

s i +1 = f ( s i , m )

Can a state machine transition depend on [both the current and] the previous state?

Sì, può. Il costrutto risultante si qualifica ancora come una macchina a stati. Una transizione di macchina dello stato può dipendere da un numero finito di stati precedenti. In altre parole,

s i +1 = f ( s i , s i -1 , m )

è valido per una macchina a stati.

p.s. Lo pseudostato della cronologia ha anche un effetto sul fatto che la transizione è guidata da una cronologia più vecchia oltre allo stato corrente e al messaggio in arrivo.

    
risposta data 02.10.2018 - 22:16
fonte

Leggi altre domande sui tag