11.10.2016

State machine component set

最近將一個Delphi的狀態機元件 - TStateMachine轉成C#版,放在Github
State machine

類別架構圖
enter image description here
所有可視化流程結點都是繼承自TStateControl,TStateControl本身為不可視元件,僅提供共用的基本屬性。

使用時,要先放置一個TStateMachine元件當做其它所有元件的Parent,再依需求放置流程節點,程式開始動作是透過TStateMachine.Execute(),另外加上了Pause()函式,可以看到上方執行後會在’Wait for call’那邊等待。
TStateMachine中使用唯一的一個執行緒來控制流程 - TStateThread,核心動作如下所示:

protected void Execute()
{
    StateMachine.ThreadStart();
    try
    {
        DoStart();
        _state = NewState;
        // Execute state transitions
        while(_state!=null)
        {
            // do
            DoEnterState(_state);
            _pauseEvent.WaitOne(Timeout.Infinite);

            if (_shutdownEvent.WaitOne(0))
                break;                
            Thread.Sleep(100);

            // Get next default state unless state was explicitly changed
            if (NewState == _state)
            {
                NewState = _state.Default();
                OldState = _state;
            }
            _state = null;
            DoExitState(OldState);

            _pauseEvent.WaitOne(Timeout.Infinite);
            _state = NewState;
            if (_shutdownEvent.WaitOne(0))
                break;

            DoTransition();
        }
        DoStop();
    }
    finally
    {
        StateMachine.ThreadStop();
    }
}

之後的目標是試著使用TPL或Reactive Extension來實作目前的架構,以及加上子狀態機?的功能

沒有留言:

張貼留言