Spero che qualcuno mi può aiutare con questo problema, o almeno sottolineare l'errore dei miei modi ...Boost Statechart - transizioni locali
Come semplice illustrazione del mio problema prendere in considerazione una parte della un'applicazione in cui è possibile immettere uno stato di funzionamento in "Modalità funzioni". Sono disponibili quattro sottomodalità a seconda del tasto funzione F1-F4 che l'utente preme. Per impostazione predefinita, viene inserita la modalità F1. Il diagramma di stato inizia come segue:
L'utente può premere F1-F4 in qualsiasi momento per passare alla modalità corrispondente. Aggiungendo queste transizioni agli stati interni porta alla seguente:
Ovviamente questo è (a) un disordine, e (b) un sacco di transizioni da definire. Se ad un certo punto voglio aggiungere un F5Mode allora ... beh, ottieni l'immagine. Per evitare questo vorrei fare quanto segue:
Boost Statechart mi permette di definire le transizioni da FunctionMode qualsiasi stati interiori, ma il risultato non è quello che mi aspettavo. Il risultato effettivo è il seguente:
Vale a dire premendo F1-F4 per passare da una modalità all'altra si provoca l'uscita dallo stato FunctionMode esterno e il rientro con l'attivazione delle azioni di uscita e di entrata indesiderate.
Nel lontano 2006, this thread tra l'autore della libreria e un utente sembra descrivere lo stesso problema. Penso che l'autore suggerisce di fare quanto segue come un work-around:
tuttavia, che il lavoro intorno non sembra molto attraente per me: Si è aggiunto un livello di condizione in più per essere compilato, il codice è diventato meno leggibile, la cronologia profonda dovrebbe essere utilizzata per tornare a qualsiasi stato secondario della modalità di funzione e l'oggetto stato intermedio viene inutilmente distrutto e ricostruito.
Quindi ... dove sto andando male? O quali sono le alternative? Ho dato una breve occhiata a Boost Meta State Machine (msm) ma da quello che ho visto finora preferisco di gran lunga l'aspetto di Statechart.
Sono sorpreso che più utenti non abbiano affrontato lo stesso problema ... il che mi fa pensare che forse il mio approccio è completamente sbagliato!
Molte grazie per questo e scuse per il ritardo nel rispondere, sembra che non ho avuto le notifiche email attivate. Sfortunatamente, le reazioni nello stato hanno lo stesso problema: chiamare Transit <> dallo stato esterno per cambiare lo stato interno causa comunque l'uscita e il reinserimento dello stato esterno. Tuttavia, la tua alternativa suggerita mi sembra abbastanza carina, quindi grazie per questo! – Grant
@Grant: grazie, e sono contento che ti piaccia :-) –