最近將一個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來實作目前的架構,以及加上子狀態機?的功能
沒有留言:
張貼留言