1.2 增加動作
此時我們將只用一種動作:transitions,我們在下面的**中插入了黑體的部分。
#include
// ...
struct stopped;
struct active : sc::******_state< active, stopwatch, stopped >
; struct running : sc::******_state< running, active >
; struct stopped : sc::******_state< stopped, active >
; //乙個狀態可以定義任意數量的動作。這就是為什麼當多於乙個時,
//我們不得不將它們放到乙個mpl::list<> 裡。
int main()
現在我們有了所有的狀態,並在適當的位置增加了所有的遷移動作,同時我們也向stopwatch傳送了一些事件。這個狀態機會盡職盡責的按我們的希望進行狀態遷移,但依然現在還沒有其它的動作。
1.3 state-local儲存
下一步我們將讓這個stop watch真正的記錄時間了。根據stop watch所處不同的狀態,我們需要不同的變數。
l stopped狀態:需要乙個儲存逝去時間的變數。
l running狀態:需要乙個儲存逝去時間的變數,還需要乙個儲存上一次啟動的時間點的變數。
無論狀態機在什麼狀態下,我們都必須觀察逝去時間這個變數。此外,當我們向狀態機傳送evreset事件時,這個變數應該被置為0。其它的變數只是狀態機在running狀態時需要。無論何時我們進入running狀態時,它應該被置為系統時鐘的當前時間。當我們退出running狀態時,我們僅僅從系統時鐘的當前時間減去開始時間(進入時記錄的時間),將結果加到逝去時間裡就可以了。
#include
// ...
struct stopped;
struct active : sc::******_state< active, stopwatch, stopped >
double elapsedtime() constdouble & elapsedtime()private :doubleelapsedtime_;
};
struct running : sc::******_state< running, active >
~running()private :std:: time_tstarttime_;};
這個狀態機現在可以測量時間了,但是我們還不能看到結果。
在這裡,state-local storage的優勢還沒有完成顯現出來。在faq專案「state-local storage酷在**?」中,會通過與乙個沒有用state-local storage的stop watch的比較來說明。
1.4 在狀態機外得到狀態資訊
為了取得測量的時間,我們需要乙個從狀態機外得到狀態資訊的機制。按我們現在的狀態機設計,可以有兩種方法。為簡單起見,我們在這裡用乙個低效的方式:state_cast<>()(在stopwatch2.cpp中我們會用乙個稍複雜一點的替代方法)(譯者注:在stopwatch2.cpp中是向狀態機傳送乙個取得逝去時間的事件,從事件成員量中將逝去時間帶回來 ),從字面意思就可以看出,它在語義上與dynamic_cast有點相似。例如,當我們呼叫mywatch.state_cast()時,當狀態機在stopped狀態時,我們會得到乙個stopped狀態類的引用。否則,會丟擲std::bad_cast異常。我們可以利用這個功能來實現乙個stopwatch的成員函式,讓它的結果返回逝去的時間。然而,我們不是先問一下狀態機在什麼狀態,然後再去用不同的方法計算逝去時間,而是將計算放到stopped和running狀態中,用乙個介面來獲得逝去逝去時間。
#include
// ...
struct ielapsedtime;
struct active;
struct stopwatch : sc::state_machine< stopwatch, active >
};
// ...
struct running :ielapsedtime,sc::******_state< running, active >
~running()
virtual
double elapsedtime() const
private :std:: time_t starttime_;};
struct stopped :ielapsedtime,sc::******_state< stopped, active >
};
int main()
為了確實看到被測量的時間,你應該想辦法在main()中單步執行。stopwatch例子將這個程式擴充套件為乙個互動式的終端程式了。
boost狀態機說明
1.狀態 物件在其生命週期內,所處於的運動和發展階段。例如 人可以處於工作中這個狀態,也可以處於娛樂中狀態。狀態應該有上下文環境。例如 人處於工作中狀態,要屬於職業生涯狀態而不能是退休狀態,也必須是活著的,而不能是死亡的狀態。狀態可以有子狀態。例如 工作中狀態,可以有開會中,會客中,被訓斥中等子狀態...
python 狀態機教程 文字處理狀態機
狀態機是關於設計程式來控制應用程式中的流程。它是乙個有向圖,由一組節點和一組過渡函式組成。處理文字檔案通常包括順序讀取文字檔案的每個塊並執行某些操作以響應每個塊讀取。塊的含義取決於它之前存在的塊的型別以及它之後的塊。該機器是關於設計程式來控制應用程式中的流程。它是乙個有向圖,由一組節點和一組過渡函式...
FPGA 狀態機的模型之Moore型狀態機
上篇博文 狀態機,fpga的靈魂,說到了狀態機的基礎知識,講到了狀態機的組成六要素,工作四要素。這篇博文來講狀態機的模型之moore狀態機,從標題也能看出,狀態機的知識並沒有結束,後面還會提到mealy型狀態機。根據狀態機的輸出與其現態 輸入之間的關係,可將fpga中的狀態機抽象為三種基本模型 mo...