PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 25 → Máquina de Estados com Threads
Máquina de Estados com Threads
Iniciado por Boller, 14,oct. 2024 16:58 - No hay respuesta
Miembro registrado
4.520 mensajes
Publicado el 14,octubre 2024 - 16:58
Prezados,

Com base nesse link

https://www.codeproject.com/Articles/1156423/Cplusplus-State-Machine-with-Threads

Convertemos para WLanguage:

Para converter a abordagem de uma máquina de estados com threads em C++ para WLanguage, vou adaptar o conceito de estados e transições usando os recursos de WLanguage, mantendo a lógica de multi-threading.

Aqui está um esqueleto básico que traduz o conceito para WLanguage:

Estrutura de uma Máquina de Estados com Threads em WLanguage

1. Definir os estados:
• Usamos uma ENUM para definir os estados possíveis.
2. Controle de transição de estados:
• Podemos implementar um laço principal que gerencia as transições.
3. Uso de threads:
• Utilizaremos a função ThreadExecute do WLanguage para iniciar threads que representarão ações ou estados que precisam rodar em paralelo.

Aqui está uma possível conversão:

// Definindo os estados da máquina de estados
ENUM eState
State_INIT = 1
State_RUNNING
State_WAITING
State_DONE
END

// Variável global para armazenar o estado atual
g_currentState is eState = State_INIT

// Função que executa a lógica de cada estado
PROCEDURE ExecuteState()
SWITCH g_currentState
CASE State_INIT:
Info("Inicializando...")
// Simulação de processamento
ThreadExecute("RunThread", threadNormal, RunThread)
g_currentState = State_RUNNING
CASE State_RUNNING:
Info("Máquina em execução...")
// Simula um delay para a transição
ThreadPause(500)
g_currentState = State_WAITING
CASE State_WAITING:
Info("Esperando...")
// Simula um tempo de espera e vai para o estado final
ThreadPause(1000)
g_currentState = State_DONE
CASE State_DONE:
Info("Processo concluído")
// Finaliza o processo
ThreadEnd("RunThread")
RETURN
END
END

// Função para ser executada como uma thread
PROCEDURE RunThread()
WHILE True
Info("Thread Executando...")
ThreadPause(100)
END
END

// Função principal que controla a máquina de estados
PROCEDURE MainStateMachine()
WHILE g_currentState <> State_DONE
ExecuteState()
Multitask(50) // Permite que outras threads rodem
END
Info("Máquina de estados finalizada.")
END

// Inicializa o processo
MainStateMachine()

Explicações:

1. Estados com ENUM:
• O ENUM define os estados que a máquina pode ter: INIT, RUNNING, WAITING, e DONE.
2. Função ExecuteState:
• A função ExecuteState verifica o estado atual e realiza ações específicas baseadas no estado, usando um SWITCH. Cada bloco de CASE representa a lógica para um estado.
3. Multi-threading:
• Utilizamos ThreadExecute para criar uma thread que simula um processo paralelo (no caso, a função RunThread). Esta função fica rodando enquanto a máquina de estados não chega ao estado DONE.
• A função Multitask permite que o WLanguage faça a troca de contexto entre threads.
4. Transição de Estados:
• A transição de um estado para outro é feita ao final de cada CASE. O próximo estado é configurado dentro da função ExecuteState.
5. Thread Handling:
• ThreadPause é usada para simular tempos de processamento ou espera entre os estados.
• Quando o estado final é alcançado (State_DONE), a thread é encerrada com ThreadEnd.

Considerações Finais:

• Este é um exemplo simples de como converter o conceito de uma máquina de estados com threads para WLanguage. Dependendo da complexidade da aplicação, você pode adicionar mais estados, controlar eventos externos, ou implementar callbacks.

Se houver algum ajuste que você gostaria ou outra especificação, me avise!

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/