Problema de sincronización de la máquina de estado de la cola - ¡Urgente!
La máquina de estados es un concepto importante en la programación de software. Más importante que este concepto es su aplicación flexible. En un programa claro y eficiente, debe haber una máquina de estados.
Por ejemplo, un programa de análisis de comandos de teclado puede considerarse como una máquina de estado: originalmente está en el estado A, se activa una tecla y luego cambia al estado B después de activar otra tecla; estado C, o devuelve el estado A. Este es el ejemplo más simple de una máquina de estados clave. El programa de resolución de claves real será más complicado que esto, pero esto no afectará nuestra comprensión de la máquina de estados.
Además, el botón en sí también puede considerarse como una máquina de estados. Un pequeño conjunto de teclas incluye: Liberar, Rebotar, Cerrar, Rebotar y Reliberar.
De manera similar, la temporización de las comunicaciones en serie (independientemente del protocolo que siga, puerto serie estándar o I2C; ya sea por cable, infrarrojos o inalámbrico) también se puede considerar como una serie de estados finitos.
El escáner de pantalla también es una máquina de estado; el analizador de comandos de comunicación también es una máquina de estado; incluso el control de activación/liberación del relé y el control de encendido/apagado del diodo emisor de luz no son máquinas de estado.
Cuando abrimos nuestra mente e introducimos la máquina de estados como una idea en el programa, encontraremos un atajo eficaz para resolver el problema. A veces puede ser más eficaz utilizar el pensamiento de la máquina de estados para pensar en lo que debería hacer el programa que utilizar el pensamiento de flujo de control. De esta forma, la máquina de estados tiene funciones más prácticas.
El programa es en realidad una máquina de estados.
Quizás no entiendas la frase anterior. Piénselo, ¿no se basa la construcción de computadoras en los dos estados básicos de "0" y "1"?
Elementos de una máquina de estados
Una máquina de estados se puede resumir en cuatro elementos, a saber, el estado actual, las condiciones, las acciones y los estados secundarios. Esta inducción se debe principalmente a la consideración de la causalidad interna de la máquina de estados. Ahora bien, los estados y las condiciones son causas, y las acciones y los estados secundarios son efectos. La explicación detallada es la siguiente:
①Estado actual: se refiere al estado actual.
②Condición: también llamado "evento". Cuando se cumple una condición, se activará una acción o se realizará una transición de estado.
③Acción: Acción ejecutada después de que se cumplan las condiciones. Una vez completada la acción, puede pasar a un nuevo estado o mantener el estado original. No se requieren acciones y, cuando se cumplen las condiciones, puede migrar directamente al nuevo estado sin realizar ninguna acción.
④Estado secundario: el nuevo estado al que se transferirá una vez que se cumplan las condiciones. El "estado secundario" es relativo al "estado actual". Una vez activado, se transforma en un nuevo "estado ahora".
Si resumimos y unificamos aún más el "estado actual" y el "estado secundario" e ignoramos la "acción" (degeneración), solo quedarán dos elementos clave, a saber, el estado y la condición migratoria.
Hay muchas formas de expresar una máquina de estados. Podemos expresar una máquina de estados en forma de palabras, números o tablas.
Es muy ineficaz describirlo únicamente con palabras, así que no lo presentaré. A continuación, introduzcamos el método de gráficos.
Diagrama de transición de estados
El diagrama de transición de estados (STD) es una forma gráfica de describir los estados del sistema y las relaciones entre ellos. Hay muchas formas de dibujar diagramas de transición de estados, pero generalmente son las mismas. Usamos un ejemplo para ilustrar su dibujo, como se muestra en la Figura 1.
Figura 1 Diagrama de transición de estado
①Cuadro de estado: utilice cuadros para representar estados, incluidos los llamados "estado actual" y "estado secundario".
② Condiciones y flechas de transición: utilice flechas para indicar la dirección de la transición de estado y marque las condiciones de activación en las flechas.
③Círculo de nodos: cuando varias flechas apuntan a un estado, se pueden usar símbolos de nodos (círculos pequeños) para conectar los resúmenes.
④Cuadro de acción: representado por un cuadro ovalado.
⑤Cuadro de juicio de condición adicional: representado por un cuadro de diamante hexagonal.
El diagrama de transición de estado es esencialmente diferente de nuestros diagramas de flujo comunes, lo que se refleja específicamente en: en el diagrama de flujo, la flecha representa el salto del puntero de la PC del programa; en el diagrama de transición de estado, la flecha; Representa el cambio de estado.
Descubriremos que este tipo de diagrama de transición de estado es más conciso, intuitivo y fácil de entender que los diagramas de flujo de programas ordinarios. Esto es exactamente lo que necesitamos lograr.
Tabla de transición de estados
Además del diagrama de transición de estados, también podemos expresar la relación entre estados en forma de tablas. Este tipo de tabla generalmente se denomina tabla de transición de estados.
La Tabla 1 es otra descripción del diagrama de transición de estado presentado anteriormente.
Tabla 1 Tabla de transición de estado
①La ventaja de describir la máquina de estados en forma tabular es que puede acomodar más información de texto. Por ejemplo, no solo podemos describir la relación de transición de estado en la tabla de transición de estado, sino que también podemos incluir una descripción de las características de cada estado.
(2) Si la tabla contiene mucho contenido y está demasiado hinchada para leerla, también podemos dividir la tabla de transición de estado. Dependiendo del contenido específico de la tabla dividida, el nombre de la tabla también cambia.
(3) Por ejemplo, podemos separar las características del estatus de la relación migratoria. Una tabla separada que describe las características de un estado también puede denominarse "tabla de verdad del estado". La más común es enumerar el contenido de visualización de cada estado por separado. Esta tabla que describe el contenido de visualización de cada estado se denomina "tabla de verdad de visualización". De manera similar, llamamos a la tabla de transición de estado basada en claves "tabla de verdad de función clave". Alternativamente, si cada estado contiene demasiada información, también podemos enumerar cada estado individualmente.
Se puede ver que la tabla de transición de estado es un complemento útil del diagrama de transición de estado y su forma de expresión es flexible.
⑤La ventaja de la tabla de transición de estado es que cubre una gran área de información, pero la desventaja es que no es visualmente intuitiva y no puede reemplazar el diagrama de transición de estado. Lo ideal es una combinación de gráficos y tablas. Utilice gráficos para mostrar macros y tablas para explicar detalles. Los dos se refieren entre sí y se complementan.
Utilice la idea de la máquina de estados para implementar el programa de reloj
A continuación, daré un ejemplo práctico de una aplicación de máquina de estados basada en el diagrama de flujo, el diagrama de transición de estado y la transición de estado. La siguiente figura es el diagrama de transición de estado del programa de reloj, como se muestra en la Figura 2.
Figura 2 Diagrama de transición de estado del programa de reloj
Después de resumir brevemente este diagrama, podemos obtener otra expresión del mismo: la tabla de transición de estado, como se muestra en la Tabla 2.
Tabla 2 Tabla de transición de estado del programa de reloj
Cosas a tener en cuenta en la aplicación de la máquina de estado
La dificultad para aplicar el mecanismo de programación del programa basado en la máquina de estado no es El concepto de comprensión de la máquina de estados, sino una división razonable del estado de funcionamiento del sistema.
Los principiantes suelen considerar una "acción de programa" como un "estado". Yo lo llamo "pseudoestado". Entonces, cómo distinguir entre "acción" y "estado". La experiencia del artesano es observar la naturaleza de los dos: la "acción" es inestable incluso si no hay una condición para desencadenar, la "acción" terminará una vez ejecutada, mientras que el "estado" es relativamente estable. desencadenante, un estado durará para siempre.
Otro error fatal para los principiantes es omitir algunos estados al dividirlos. Yo lo llamo una "fuga".
La existencia de "estados falsos" y "estados con fugas" conducirá a la desintegración de la estructura del programa. Así que presta especial atención para evitarlo.
Máquinas de estados más complejas
Lo que se introdujo anteriormente es una estructura de estados simple. Tiene solo un nivel y una dimensión, como se muestra en la Figura 3.
Figura 3 Estructura de máquina de estados lineal
Si es necesario, podemos construir un modelo de máquina de estados más complejo.
1 Estructura de estados multinivel
Las máquinas de estados pueden ser multinivel. En un sistema jerárquico de máquina de estados multinivel, un "estado padre" se puede dividir en varios "subestados". Estos subestados * * * tienen ciertas características del estado padre de nivel superior, y al mismo tiempo cada uno de ellos. tiene sus propias características únicas.
En algunos estados, los subestados se pueden dividir aún más. Por ejemplo, podemos modificar el ejemplo del reloj anterior de la siguiente manera:
Combina todos los estados relacionados con la función del reloj en 1 estado de primer nivel. En este estado, se puede dividir en tres subestados secundarios, a saber, mostrar la hora, configurar la hora y configurar los minutos;
Del mismo modo, también podemos combinar todos los estados relacionados con la función del despertador en un primer nivel. estado.
En este estado, se divide en cuatro subestados secundarios, a saber, mostrar el despertador, configurar "horas", configurar "minutos" y configurar el tiempo de llamada.
Necesitamos otra variable de estado (registro) para representar estos subestados.
Por supuesto, también puede haber un estado nieto de nivel inferior (con infinitos hijos y nietos) bajo el estado hijo, lo que convierte todo el sistema estatal en una estructura estatal de varios niveles en forma de árbol, como como se muestra en la Figura 4.
Figura 4 Estructura estatal multinivel en forma de árbol
2 Estructura nacional multidimensional
La estructura estatal también puede ser multidimensional. Los estados del sistema se dividen desde diferentes perspectivas y algunas características de estos estados se superponen. Por ejemplo, mientras se dividen los estados según botones y pantallas, otro estado se divide según el proceso de trabajo del sistema. Estas dos divisiones estatales coexisten y se cruzan entre sí, formando así un espacio de estructura estatal bidimensional.
Dé un ejemplo, como por ejemplo: control remoto del aire acondicionado, como se muestra en la Figura 5.
Figura 5 Estructura de máquina de estados multidimensional
Del mismo modo, también podemos construir estructuras de estados tridimensionales, cuatridimensionales o incluso más dimensionales. El estado de cada dimensión debe estar representado por una variable de estado (registro).
No importa cuán encantadoras parezcan las estructuras multinivel y multidimensionales, la sugerencia del artesano es: simplificar la estructura estatal tanto como sea posible. Tanto las estructuras unidimensionales como las de un solo nivel son aceptables. No te cause problemas a ti mismo. Juega con estructuras terriblemente complejas.
La simplicidad es lo más eficaz.
Conclusión
La comprensión de las máquinas de estados requiere un proceso de superficial a profundo. Este proceso debe considerarse en base a aplicaciones prácticas y casos específicos. Cuando una buena idea se convierte en un hábito de diseño, puede traer recompensas al diseñador. Espero que las ideas de programación basadas en máquinas de estados presentadas en este cuaderno puedan inspirar a los principiantes y ayudarlos a encontrar la sensación de "programar". ¡Espero que esto ayude! !