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

類別架構圖 
 
 
 所有可視化流程結點都是繼承自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來實作目前的架構,以及加上子狀態機?的功能
 
 
沒有留言:
張貼留言