• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-380  評(píng)論-37  文章-0  trackbacks-0

            來(lái)自:http://m.shnenglu.com/shanoa/archive/2009/05/30/86143.html
            接觸了boost的狀態(tài)機(jī),發(fā)現(xiàn)不是想象中的那么好用,在一些地方還得用上mpl庫(kù)里的東西,由于對(duì)模板元編程不是很熟練,搞了好些天才算弄明白這該死的mpl::list的原理和用法。
            boost的狀態(tài)機(jī)是屬于靜態(tài)鏈接的狀態(tài)機(jī),也就是說(shuō),它的圖結(jié)構(gòu)是編譯期間就確定了的,在運(yùn)行時(shí)不可以動(dòng)態(tài)配置。所以,它的用途是有一定局限性的,但在一般情況下,它不僅很通用,而且在你會(huì)用并熟練地情況下,還會(huì)很好用,用起來(lái)很舒服,邏輯也很合理。下面就是一段代碼,當(dāng)然也是借鑒了別人的東西,自己修改了一下,在MainState中添加了一個(gè)Transition做了測(cè)試,因?yàn)榇饲拔疫€不知道一個(gè)狀態(tài)如何包含多個(gè)Transition,呵呵,原來(lái)是用mpl::list來(lái)做。至于這個(gè)狀態(tài)機(jī)的入門(mén)教程,網(wǎng)上隨處可見(jiàn)的三部曲:《boost 狀態(tài)機(jī)入門(mén)教程》說(shuō)得很清楚。

              1 #include <iostream>
              2 #include <ctime>
              3 
              4 #include <boost/statechart/transition.hpp>
              5 #include <boost/statechart/event.hpp>
              6 #include <boost/statechart/state_machine.hpp>
              7 #include <boost/statechart/simple_state.hpp>
              8 
              9 namespace sc = boost::statechart;
             10 
             11 
             12 
             13 class EvtStartStop : public sc::event<EvtStartStop>{};
             14 class EvtReset : public sc::event<EvtReset>{};
             15 class EvtGo : public sc::event<EvtGo>{};
             16 
             17 
             18 class MainState;
             19 class StopState;
             20 class RunState;
             21 class TwoState;
             22 
             23 class Machine : public sc::state_machine<Machine, MainState>
             24 {};
             25 
             26 
             27 
             28 
             29 
             30 
             31 class MainState : public sc::simple_state<MainState, Machine, StopState>
             32 {
             33 public:
             34     typedef sc::transition<EvtReset, MainState> reactReset;
             35     typedef sc::transition<EvtGo, TwoState> reactGo;
             36     typedef boost::mpl::list<reactReset, reactGo> reactions;
             37 
             38     MainState(void){
             39         std::cout<<"進(jìn)入MainState"<<std::endl;
             40         mTime = 0;
             41     }
             42 
             43     ~MainState(void){
             44         std::cout<<"退出MainState"<<std::endl;
             45     }
             46 
             47     double mTime;
             48 };
             49 
             50 
             51 // 該狀態(tài)屬于無(wú)用狀態(tài),用于測(cè)試mpl::list的多transition用法
             52 class TwoState : public sc::simple_state<TwoState, Machine>
             53 {
             54 public:
             55     typedef sc::transition<EvtGo, MainState> reactions;
             56 
             57     TwoState(void){
             58         std::cout<<"進(jìn)入TwoState"<<std::endl;
             59     }
             60 
             61     ~TwoState(void){
             62         std::cout<<"退出TwoState"<<std::endl;
             63     }
             64 };
             65 
             66 
             67 class StopState : public sc::simple_state<StopState, MainState>
             68 {
             69 public:
             70     typedef sc::transition<EvtStartStop, RunState> reactions;
             71     StopState(void){
             72         std::cout<<"進(jìn)入StopState"<<std::endl;
             73     }
             74 
             75     ~StopState(void){
             76         std::cout<<"退出StopState"<<std::endl;
             77     }
             78 };
             79 
             80 class RunState : public sc::simple_state<RunState, MainState>
             81 {
             82 public:
             83     typedef sc::transition<EvtStartStop, StopState> reactions;
             84     RunState(void){
             85         std::cout<<"進(jìn)入RunState"<<std::endl;
             86         mStartTime = 0;
             87     }
             88 
             89     ~RunState(void){
             90         std::cout<<"退出RunState"<<std::endl;
             91         context<MainState>().mTime += std::difftime(std::time(0), mStartTime);
             92     }
             93 
             94     std::time_t mStartTime;
             95 };
             96 
             97 
             98 int _tmain(int argc, _TCHAR* argv[])
             99 {
            100     Machine mc;
            101     mc.initiate();
            102 
            103     mc.process_event(EvtStartStop());
            104     mc.process_event(EvtStartStop());
            105     mc.process_event(EvtReset());
            106     mc.process_event(EvtGo());
            107     mc.process_event(EvtGo());
            108 
            109     return 0;
            110 }
            posted on 2010-10-03 19:10 小王 閱讀(1008) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Boost
            久久久精品视频免费观看| 久久青青草原亚洲av无码app| 久久国产乱子精品免费女| 国产亚洲婷婷香蕉久久精品| 免费观看成人久久网免费观看| 久久福利片| jizzjizz国产精品久久| 久久丝袜精品中文字幕| 亚洲av日韩精品久久久久久a| 国产成人综合久久精品尤物| 久久天天躁狠狠躁夜夜不卡| 久久精品国产99国产电影网 | 99久久超碰中文字幕伊人 | 日韩精品久久久肉伦网站 | 国産精品久久久久久久| 天天躁日日躁狠狠久久| 亚洲欧美日韩精品久久亚洲区 | 久久免费大片| 亚洲国产精品久久66| 久久综合国产乱子伦精品免费| 91精品国产综合久久香蕉 | 久久99精品国产自在现线小黄鸭| 久久亚洲高清综合| 国产精品欧美久久久久无广告 | 久久有码中文字幕| 香蕉久久一区二区不卡无毒影院| 狠狠色噜噜色狠狠狠综合久久| 久久99热这里只有精品国产 | 国产∨亚洲V天堂无码久久久| 漂亮人妻被中出中文字幕久久| 久久精品国产亚洲7777| 久久AⅤ人妻少妇嫩草影院| 国产高潮久久免费观看| 久久r热这里有精品视频| 97超级碰碰碰久久久久| 国产精品免费看久久久| 国产精品美女久久久久| 欧美亚洲国产精品久久蜜芽| 91性高湖久久久久| 久久精品综合一区二区三区| 久久人人超碰精品CAOPOREN|