using System.Threading; namespace StateMachineExample { public class StateMachineEngine { #region Properties private string _threadName; public string ThreadName { get { return _threadName; } set { _threadName = value; } } private int _machinetimeOut; public int MachineTimeOut { get { return _machinetimeOut; } set { _machinetimeOut = value; } } private QueueHandler _qh; public QueueHandler QueueHdlr { get { return _qh; } set { _qh = value; } } private Thread _engineFunction; public delegate void functionDelegate(QueueHandler qh); public functionDelegate fx; #endregion #region Constructor public StateMachineEngine(string Name, functionDelegate function , int timeOut, Message FirstState) { ThreadName = Name; //Function to call containing the states fx = function; _engineFunction = new Thread(Engine); MachineTimeOut = timeOut; _qh = new QueueHandler(); _qh.Enque(FirstState); } #endregion #region Methods public void Run() { _engineFunction.Start(); } public Message GetNextState() { return (Message)_qh.Dequeue(); } public void SetNextState(Message StateData) { _qh.Enque(StateData); } private void Engine() { while (true) { fx(_qh); Thread.Sleep(_machinetimeOut); } } #endregion } }