??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久亚洲AV无码专区首JN,久久精品国产WWW456C0M,久久婷婷综合中文字幕http://www.shnenglu.com/jack-wang/category/10927.htmlzh-cnSun, 27 Jun 2021 02:49:35 GMTSun, 27 Jun 2021 02:49:35 GMT60boost~译QWindowsq_Q?/title><link>http://www.shnenglu.com/jack-wang/archive/2021/06/26/217724.html</link><dc:creator>王</dc:creator><author>王</author><pubDate>Fri, 25 Jun 2021 23:45:00 GMT</pubDate><guid>http://www.shnenglu.com/jack-wang/archive/2021/06/26/217724.html</guid><wfw:comment>http://www.shnenglu.com/jack-wang/comments/217724.html</wfw:comment><comments>http://www.shnenglu.com/jack-wang/archive/2021/06/26/217724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/jack-wang/comments/commentRss/217724.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/jack-wang/services/trackbacks/217724.html</trackback:ping><description><![CDATA[1、下载最新版本,当前最新版本ؓ1.76Q下载后解压<br />2、进入根目录Q运行下面的bootstrap.batQ生成b2.exeQ以前的<span style="color: #333333; font-family: "PingFang SC", "Lantinghei SC", "Microsoft YaHei", arial, 宋体, sans-serif, tahoma; font-size: 16px; background-color: #ffffff;">bjam.exe已经被淘C</span>Q?br />3、打开VS工具x86 Native Tools Command PromptQ进入boost解压文gҎ目录Q执行命令:<div><span style="font-size: 16px;">b2 install --toolset=msvc-14.2 --build-type=complete --prefix=“E:\Packet\boost_1_72_0\compile” link=shared runtime-link=shared runtime-link=static threading=multi debug release</span></div><div><br />漫长的等待,镉K的站?/div><span style="background-color: #ffffff;"><font color="#4d4d4d" face="-apple-system, SF UI Text, Arial, PingFang SC, Hiragino Sans GB, Microsoft YaHei, WenQuanYi Micro Hei, sans-serif, SimHei, SimSun"><span style="font-size: 16px;">O了!</span></font></span><img src ="http://www.shnenglu.com/jack-wang/aggbug/217724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/jack-wang/" target="_blank">王</a> 2021-06-26 07:45 <a href="http://www.shnenglu.com/jack-wang/archive/2021/06/26/217724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>~译boost1.54http://www.shnenglu.com/jack-wang/archive/2013/08/20/202675.htmlTue, 20 Aug 2013 08:12:00 GMThttp://www.shnenglu.com/jack-wang/archive/2013/08/20/202675.htmlhttp://www.shnenglu.com/jack-wang/comments/202675.htmlhttp://www.shnenglu.com/jack-wang/archive/2013/08/20/202675.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/202675.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/202675.html我把它解压到q里D:\boost_1_54_0?br /> 从控制台q入D:\boost_1_54_0目录中,输入命obootstrap 执行后启动编译程序,开始准备编译环境,E等片刻Q?br />提示再次输入~译参数Q我输入 .\b2   Q生成vs2010工程文gQ?
执行后开始编译源文g
{待Q,Q?br />{待Q,Q?


补充Q?
使用VS2013工具集编译,命o如下:
.\b2 --toolset=msvc-12.0

2013-08-20 16:12 发表评论
]]>
模板元编E?--- ?MPL 解决实际问题http://www.shnenglu.com/jack-wang/archive/2010/10/04/128589.htmlMon, 04 Oct 2010 10:40:00 GMThttp://www.shnenglu.com/jack-wang/archive/2010/10/04/128589.htmlhttp://www.shnenglu.com/jack-wang/comments/128589.htmlhttp://www.shnenglu.com/jack-wang/archive/2010/10/04/128589.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/128589.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/128589.html转:http://blog.csdn.net/ralph623/archive/2005/10/15/504369.aspx

?STL 中有各种容器Q?STL 法允许我们对容器中的元素做各种操作Q下面的E序对于每一个当代的 C++ E序员都应该是轻而易丄Q?/p>

#include <iostream>
#include <list>
#include <algorithm>
#include <string>

using namespace std;

struct print
{
    void operator()(const string& _str)
    {
        cout << _str << endl;
    }
};

int main()
{
    list<string> str_list;
    str_list.push_front("hello");
    str_list.push_front("world");
   
    list<string> another_list;
    another_list.push_back("hello");
    another_list.push_back("world");
   
    for_each(str_list.begin(), str_list.end(), print());
    for_each(another_list.begin(), another_list.end(), print());
}

q行l果Q?/p>

world
hello
hello
world

单的东西往往能说明深ȝ道理Q在q个E序里,我们遇到的本质问题是什么?首先Q我们有一个容器;其次Q我们可以往容器里面放东西,最后,我们可以通过法把一个操作施加于q个容器中的每一个(也可以是部分Q元素中。这是上面E序中凝l的本质问题?/p>

MPL 可以看成?STL 的编译期版本Q或者说元编E版本。它同样也提供了各种容器Q只不过容纳的对象不是数据,而是cd。它们的构造方式语法上比较cMQ或者甚臻I我以为,更有一点:

#include <string>
#include <iostream>
#include <boost/mpl/at.hpp>
#include <boost/mpl/list.hpp>
#include <boost/mpl/push_front.hpp>

using namespace boost;

int main()
{
    typedef mpl::list<> type_list1;
    typedef mpl::push_front<type_list1, int>::type type_list2;
    typedef mpl::push_front<type_list2, std::string>::type type_list;
   
    // 或者这h?br>    typedef mpl::list<int, std::string> another_list;
   
    std::cout << typeid(mpl::at_c<type_list, 0>::type).name() << std::endl;
    std::cout << typeid(mpl::at_c<type_list, 1>::type).name() << std::endl;
   
    std::cout << typeid(mpl::at_c<another_list, 0>::type).name() << std::endl;
    std::cout << typeid(mpl::at_c<another_list, 1>::type).name() << std::endl;
}

E微解释一下。mpl::list 是 std::list 的元~程版本Q?mpl::push_front 是什么就不用我说了。mpl::at_c 是一个元~程法Q作用相当于q行期的 [ ] q算W,也就是得C个容器中在某个位|上的元素。在 VC7.1 下面Q执行结果是

class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >
int
int
class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >

q跟q行期的 list 的行为几乎完全一致?/p>

当然Qmpl 也有 for_each Q而且我们也可以ؓ for_each 提供一个元~程 functor 。什么是元编E?functor Q运行时?functor 是一个提供了 operator() 重蝲?struct Q而元~程 functor 是一个提供了 operator() 模板?struct Q?/p>

#include <string>
#include <iostream>
#include <boost/mpl/at.hpp>
#include <boost/mpl/list.hpp>
#include <boost/mpl/push_front.hpp>
#include <boost/mpl/for_each.hpp>

using namespace boost;

struct print
{
    template <class T>
    void operator()(const T&)
    {
        std::cout << typeid(T).name() << std::endl;
    }
};

int main()
{
    typedef mpl::list<> type_list1;
    typedef mpl::push_front<type_list1, int>::type type_list2;
    typedef mpl::push_front<type_list2, std::string>::type type_list;
   
    typedef mpl::list<int, std::string> another_list;
   
    mpl::for_each<type_list>(print());
    mpl::for_each<another_list>(print());
}

输出与上面?mpl::at_c 的程序完全相同?/p>

当然Q到现在为止Q这些程序都q是只停留在Ua的玩L序上Q能不能做点E微有用的事情呢Q当然可以。假定我们有q样一个承体p:Ҏ一个抽象类 Product Q它有一些派生类Q例?PC Q?Printer {等Q它们的公共Ҏ SerialNo 会返回自q产品序列P而这个序列号是在构造的时候决定的Q?/p>

class Product
{
public:
    virtual std::string SerialNo()const = 0;
};

class PC : public Product
{
public:
    PC(const std::string& _sn)
        : sn_(_sn)
    {}

    std::string SerialNo()const
    {
        return sn_;
    }
private:
    std::string sn_;
};

class Printer : public Product
{
public:
    Printer(const std::string& _sn)
        : sn_(_sn)
    {}
   
    std::string SerialNo()const
    {
        return sn_;
    }
private:
    std::string sn_;
};

?mpl::list 把这些类型放在同一?list 里面当然不在话下Q但是我们希望有一个类?factory 模式的实玎ͼ让我们可以自由创建它们。下面的E序?mpl::for_each ?list 中的每一个类型创Z个实例,它当然可以被扩展来做些很有用的事情?/p>

#include <string>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <list>
#include <boost/shared_ptr.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/list.hpp>
#include <boost/mpl/for_each.hpp>

using namespace boost;

class Product
{
public:
    virtual std::string SerialNo()const = 0;
};

class PC : public Product
{
public:
    PC(const std::string& _sn)
        : sn_(_sn)
    {}

    std::string SerialNo()const
    {
        return sn_;
    }
private:
    std::string sn_;
};

class Printer : public Product
{
public:
    Printer(const std::string& _sn)
        : sn_(_sn)
    {}
   
    std::string SerialNo()const
    {
        return sn_;
    }
private:
    std::string sn_;
};

struct print
{
    template <class T>
    void operator()(const T& product)
    {
        std::cout << "Type: " << typeid(T).name()
                  << " SerialNo: " << product.SerialNo() << std::endl;
    }
};

// ׃ PC ?Print 都没有默认的 constructor Q必d上这?br>template <class T>
struct wrap {};

struct Create
{
    Create(const std::string& _line)
        : line_(_line)
        , serial_(0)
    {}
   
    template <class T>
    void operator()(wrap<T>)
    {
        std::stringstream ss;
        ss << line_ << '_' << serial_++;
        shared_ptr<T> product(new T(ss.str()));
       
        print()(*product);
    }
   
    std::string line_;
    unsigned long serial_;
};

int main()
{  
    typedef mpl::list<Printer, PC> product_list;
   
    mpl::for_each<product_list, wrap<mpl::_1> >(Create("line1"));
}

输出Q?/p>

Type: class Printer SerialNo: line1_0
Type: class PC SerialNo: line1_1


本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/ralph623/archive/2005/10/15/504369.aspx



2010-10-04 18:40 发表评论
]]>
Boost的状态机库教E?补充 http://www.shnenglu.com/jack-wang/archive/2010/10/03/128502.htmlSun, 03 Oct 2010 11:10:00 GMThttp://www.shnenglu.com/jack-wang/archive/2010/10/03/128502.htmlhttp://www.shnenglu.com/jack-wang/comments/128502.htmlhttp://www.shnenglu.com/jack-wang/archive/2010/10/03/128502.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/128502.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/128502.html转:http://www.shnenglu.com/shaker/archive/2010/08/16/123601.html

来自:http://www.shnenglu.com/shanoa/archive/2009/05/30/86143.html
接触了boost的状态机Q发C是想象中的那么好用,在一些地方还得用上mpl库里的东西,׃Ҏ板元~程不是很熟l,搞了好些天才弄明白q该ȝmpl::list的原理和用法?br>boost的状态机是属于静态链接的状态机Q也是_它的囄构是~译期间q定了的,在运行时不可以动态配|。所以,它的用途是有一定局限性的Q但在一般情况下Q它不仅很通用Q而且在你会用q熟l地情况下,q会很好用,用v来很舒服Q逻辑也很合理。下面就是一D代码,当然也是借鉴了别人的东西Q自׃改了一下,在MainState中添加了一个Transition做了试Q因为此前我q不知道一个状态如何包含多个TransitionQ呵呵,原来是用mpl::list来做。至于这个状态机的入门教E,|上随处可见的三部曲Q《boost 状态机入门教程》说得很清楚?br>

  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<<"q入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 // 该状态属于无用状态,用于试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<<"q入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<<"q入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<<"q入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 }


2010-10-03 19:10 发表评论
]]>
Boost的状态机库教E?3) http://www.shnenglu.com/jack-wang/archive/2010/10/03/128501.htmlSun, 03 Oct 2010 11:09:00 GMThttp://www.shnenglu.com/jack-wang/archive/2010/10/03/128501.htmlhttp://www.shnenglu.com/jack-wang/comments/128501.htmlhttp://www.shnenglu.com/jack-wang/archive/2010/10/03/128501.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/128501.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/128501.html转:http://www.shnenglu.com/shaker/archive/2010/08/16/123599.html

1.2 增加动作


    此时我们只用一U动作:transitionsQ我们在下面的代码中插入了黑体的部分?/span>

 1#include <boost/statechart/transition.hpp>
 2
 3// 
 4
 5struct  Stopped;
 6struct  Active : sc::simple_state< Active, StopWatch, Stopped >
 7{
 8   typedef  sc::transition< EvReset, Active > reactions;
 9}
;
10
11struct  Running : sc::simple_state< Running, Active >
12{
13   typedef  sc::transition< EvStartStop, Stopped > reactions;
14}
;
15
16struct  Stopped : sc::simple_state< Stopped, Active >
17{
18   typedef  sc::transition< EvStartStop, Running > reactions;
19}
;
20
21//一个状态可以定义Q意数量的动作。这是Z么当多于一个时Q?br>22//我们不得不将它们攑ֈ一个mpl::list<> 里?/span>
23
24int  main()
25{
26  StopWatch myWatch;
27  myWatch.initiate();
28  myWatch.process_event( EvStartStop() );
29  myWatch.process_event( EvStartStop() );
30  myWatch.process_event( EvStartStop() );
31  myWatch.process_event( EvReset() );
32   return  0;
33}

34


    现在我们有了所有的状态,q在适当的位|增加了所有的q移动作Q同时我们也向StopWatch发送了一些事件。这个状态机会尽职尽责的按我们的希望q行状态迁U,但依然现在还没有其它的动作?/span>


1.3 State-local存储


    下一步我们将让这个Stop watch真正的记录时间了。根据stop watch所处不同的状态,我们需要不同的变量?/span>

Stopped状态:需要一个保存逝去旉的变量?/span>

l Running状态:需要一个保存逝去旉的变量,q需要一个保存上一ơ启动的旉点的变量?/span>

    无论状态机在什么状态下Q我们都必须观察逝去旉q个变量。此外,当我们向状态机发送EvReSet事gӞq个变量应该被置?。其它的变量只是状态机在Running状态时需要。无Z时我们进入Running状态时Q它应该被置为系l时钟的当前旉。当我们退出Running状态时Q我们仅仅从pȝ旉的当前时间减d始时_q入时记录的旉Q,结果加到逝去旉里就可以了?/span>

 1#include <ctime>
 2
 3// 
 4
 5struct  Stopped;
 6struct  Active : sc::simple_state< Active, StopWatch, Stopped >
 7{
 8   public :
 9     typedef  sc::transition< EvReset, Active > reactions;
10
11    Active() : elapsedTime_( 0.0 ) {}
12    double  ElapsedTime()  const  {  return  elapsedTime_; }
13    double  & ElapsedTime() {  return  elapsedTime_; }
14   private :
15     double  elapsedTime_ ;
16}
;
17
18struct  Running : sc::simple_state< Running, Active >
19{
20   public :
21     typedef  sc::transition< EvStartStop, Stopped > reactions;
22
23    Running() : startTime_( std::time( 0 ) ) {}
24    ~Running()
25    {
26       // 与派生类可以讉K它的基类怼Q?br>27       //context<>() 用来获得一个状态的直接或间接的上下文的讉K权?br>28       // q可以是直接或间接的外层状态或状态机本n
29       // (例如Q像q样: context< StopWatch >()).
30      context< Active >().ElapsedTime() +=
31        std::difftime( std::time( 0 ), startTime_ );
32    }

33   private :
34    std:: time_t  startTime_;
35}
;

    q个状态机现在可以量旉了,但是我们q不能看到结果?/span>

在这里,State-local storage的优势还没有完成昄出来。在FAQ目“State-local storage酷在哪里Q?#8221;中,会通过与一个没有用State-local storage的Stop Watch的比较来说明?/span>


1.4 在状态机外得到状态信?/span>


    Z取得量的时_我们需要一个从状态机外得到状态信息的机制。按我们现在的状态机设计Q可以有两种Ҏ。ؓ单v见,我们在这里用一个低效的方式Qstate_cast<>()(在StopWatch2.cpp中我们会用一个稍复杂一点的替代Ҏ)Q?span style="COLOR: #000080">译者注Q在StopWatch2.cpp中是向状态机发送一个取得逝去旉的事Ӟ从事件成员量中将逝去旉带回?/span> Q,从字面意思就可以看出Q它在语义上与dynamic_cast有点怼。例如,当我们调用myWatch.state_cast<const Stpped&>()Ӟ当状态机在Stopped状态时Q我们会得到一个Stopped状态类的引用。否则,会抛出std::bad_cast异常。我们可以利用这个功能来实现一个StopWatch的成员函敎ͼ让它的结果返回逝去的时间。然而,我们不是先问一下状态机在什么状态,然后再去用不同的Ҏ计算逝去旉Q而是计放到Stopped和Running状态中Q用一个接口来获得逝去逝去旉?/span>

 

  1. #include <iostream> 
  2. // ... 
  3. struct  IElapsedTime 
  4.    virtual   double  ElapsedTime()  const  = 0; 
  5. }; 
  6. struct  Active; 
  7. struct  StopWatch : sc::state_machine< StopWatch, Active > 
  8.    double  ElapsedTime()  const  
  9.   { 
  10.      return  state_cast<  const  IElapsedTime & >().ElapsedTime(); 
  11.   } 
  12. }; 
  13. // ... 
  14. struct  Running : IElapsedTime,  
  15.   sc::simple_state< Running, Active > 
  16.    public
  17.      typedef  sc::transition< EvStartStop, Stopped > reactions; 
  18.     Running() : startTime_( std::time( 0 ) ) {} 
  19.     ~Running() 
  20.     { 
  21.       context< Active >().ElapsedTime() = ElapsedTime(); 
  22.     }
  23.      virtual   double  ElapsedTime()  const  
  24.         { 
  25.            return  context< Active >().ElapsedTime() + 
  26.             std::difftime( std::time( 0 ), startTime_ ); 
  27.         } 
  28.        private
  29.         std:: time_t  startTime_; 
  30.     };  
  31.      
  32.      struct  Stopped : IElapsedTime,  
  33.       sc::simple_state< Stopped, Active > 
  34.     { 
  35.        typedef  sc::transition< EvStartStop, Running > reactions; 
  36.      
  37.        virtual   double  ElapsedTime()  const  
  38.       { 
  39.          return  context< Active >().ElapsedTime(); 
  40.       }  
  41.     }; 
  42.      
  43.      int  main() 
  44.     { 
  45.       StopWatch myWatch; 
  46.       myWatch.initiate(); 
  47.       std::cout << myWatch.ElapsedTime() <<  "\n" ;  
  48.       myWatch.process_event( EvStartStop() ); 
  49.       std::cout << myWatch.ElapsedTime() <<  "\n"
  50.       myWatch.process_event( EvStartStop() ); 
  51.       std::cout << myWatch.ElapsedTime() <<  "\n"
  52.       myWatch.process_event( EvStartStop() ); 
  53.       std::cout << myWatch.ElapsedTime() <<  "\n"
  54.       myWatch.process_event( EvReset() ); 
  55.       std::cout << myWatch.ElapsedTime() <<  "\n"
  56.        return  0; 
  57.     }

Z实看到被测量的旉Q你应该惛_法在main()中单步执行。StopWatch例子这个程序扩展ؓ一个交互式的终端程序了?/span>



2010-10-03 19:09 发表评论
]]>
Boost的状态机库教E?2) http://www.shnenglu.com/jack-wang/archive/2010/10/03/128500.htmlSun, 03 Oct 2010 11:07:00 GMThttp://www.shnenglu.com/jack-wang/archive/2010/10/03/128500.htmlhttp://www.shnenglu.com/jack-wang/comments/128500.htmlhttp://www.shnenglu.com/jack-wang/archive/2010/10/03/128500.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/128500.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/128500.html转:http://www.shnenglu.com/shaker/archive/2010/08/16/123598.html

1 基础主题Q秒?/strong>
    下面我们要ؓ一个机械秒表徏模一个状态机。这样一个秒表通常会有两个按钮?br>     * Start/Stop
     * Reset
     同时有两U状态:
     * Stoped: 表针停留在上ơ停止时的位|:
        o 按下Reset按钮Q表针回退?的位|。秒表保持在Stoped状态不变?br>        o 按下Start/Stop按钮Q秒表{到Running状态?br>     * Running: 表针在移动,q持l显Cȝ旉Q?/span>
        o 按下Reset按钮Q表针回退?的位|,U表转到停止状态?br>        o 按下Start/Stop按钮Q{到Stoped状态?br>    下面是其UML图:



1.1 定义状态和事g
两个按钮可以建模Z个事件。进而,定义出必要的状态和初始状态。我们从下面的代码开始,以前的代码片D会陆箋加入其中Q?/span>

 

#include <boost/statechart/event.hpp>
#include 
<boost/statechart/state_machine.hpp>
#include 
<boost/statechart/simple_state.hpp>

namespace sc = boost::statechart;

struct EvStartStop : sc::event< EvStartStop > {};
struct EvReset : sc::event< EvReset > {};

struct Active;
struct StopWatch : sc::state_machine< StopWatch, Active > {};

struct Stopped;

// q里的simple_statecL板可以接?个参敎ͼ
// - W?个参数指定内部的初始状态,如果有一个这L状态的话?br>//   在这里,Active有一个内部状态(StopedQ, 所以将q个内部
//   初始状态传l它的基cR?br>// - W?个参数指定是否保留和保留什么类型历?br>
// Active是最外层的状态,因此要把它所属的状态机cMl它
struct Active : sc::simple_state<
  Active, StopWatch, Stopped 
> {};

// Stopped ?nbsp;Running 都把Active作ؓ它们的上下文Q这使他们嵌入到了Active状态中?/span>
struct Running : sc::simple_state< Running, Active > {};
struct Stopped : sc::simple_state< Stopped, Active > {};

// 因ؓ状态的上下文必L一个完整的cdQ不能单单是声明Q,
// 所以状态机必须要在“外层状?#8221;之间先定义?br>// 也就是说Q我们需要从状态机开始,然后是最外层的状态,然后是其内部的状态,如此反复?br>// 我们可以用广度或深度方式Q再或是以两都؜合的方式来进行定义?/span>

int main()
{
  StopWatch myWatch;
  myWatch.initiate();
  
return 0;
}

q个代码已经可以~译了,但不会发生Q何可察觉的事件?/p>

2010-10-03 19:07 发表评论
]]>
Boost的状态机库教E?1) http://www.shnenglu.com/jack-wang/archive/2010/10/03/128499.htmlSun, 03 Oct 2010 11:06:00 GMThttp://www.shnenglu.com/jack-wang/archive/2010/10/03/128499.htmlhttp://www.shnenglu.com/jack-wang/comments/128499.htmlhttp://www.shnenglu.com/jack-wang/archive/2010/10/03/128499.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/128499.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/128499.html转:http://www.shnenglu.com/shaker/archive/2010/08/16/123597.html 介绍
    Boost状态机库一个应用程序框Ӟ你可以用它将UML状态图快速的转换为可执行的c++代码Q而不需要Q何的代码生成器。它支持几乎所有的UML特征Q可以直接了当的转换Qƈ且{换后的c++代码像对状态机q行一ơ文本描qC样具体可L?br>
如何阅读q个教程
    q个教程是以U性阅ȝ方式q行的章节设计。如果你是第一ơ看q个教程的话Q你可以从头开始读Q到你觉得了解的东西对你手头的Q务来说已l够时停止。具体可以这P
    * 如果你的d是要实现一个小的、简单的Qƈ且有很少几个状态的状态机Q那么下面的“初主题Q秒?#8221;里所讲的差不多够你用的了?br>    * 如果你要做一个有很多状态的大型状态机Q你可以看一?#8220;中主题Q数码相?#8221;Q那里的讲解可能对你有帮助?br>    * 最后,如果你是一个要创徏异常复杂状态机的用P或者是一个想要评C个Boost状态机的设计师的话Q你p看一?#8220;高主题”部分。ƈ且,我还强烈你看一下Rationle里的Limitions部分?br>
Hello World!
    我们要从一个最单程序开始我们的W一步,状态图如下Q?br>
对于q个状态图Q我们的实现代码如下Q?
 1#include <boost/statechart/state_machine.hpp>
 2#include <boost/statechart/simple_state.hpp>
 3#include <iostream>
 4
 5namespace  sc = boost::statechart;
 6
 7// Z避免写publicQ下面声明的cd全部为struct?br> 8// 如果你不在乎的话可以把它们都Ҏclass?br> 9
10// 我们需要先声明一下初始状态,q是因ؓ我们要在定义状态机时用它
11// 但又不得不在状态机q后定义它?/span>
12
13struct  Greeting;
14
15// Boost.Statechart大量应用模板模式?br>16// zcdd自己做ؓ基类模板的第一个参数?br>17//
18// 状态机必须要知道当其初始化后进行的W一个状态?br>19// q就是ؓ什么Greeting要做为每二个模板参数?br>20// Q译者注Q也是说Greeting状态是Machine状态机初始化后q入的第一个状态)
21struct  Machine : sc::state_machine< Machine, Greeting > {};
22
23// 对于每一个状态,我们需要ؓ其指明:它属于哪一个状态机Q它位于状态图的哪个位|?br>24// 我们用simple_state<>的上下文参数可以完成这些指定了?br>25// 对于我们目前的这个简单的状态机来说Q上下文是状态机QMachine)
26// 所以,Machine必须要做为simple_state的第二个模块参数?br>27// Q关于上下文参数的详l解释在下一个例子中有)
28struct  Greeting : sc::simple_state< Greeting, Machine >
29{
30  // 一旦状态机q行一个状态的时候,它就要创Z个相应状态类的对象(cd例)
31  // 只要状态机保持在这个状态下Q这个对象就会一直存在?br>32  // 最后,当状态机dq个状态时Q对象被销毁?br>33  // 所以,一个状态的q入动作是q个状态类的构造器Q而它的退出动作则是它的析构类?nbsp;  Greeting() { std::cout <<  "Hello World!\n" ; }  // q入
34  ~Greeting() { std::cout <<  "Bye Bye World!\n" ; }  // 退?/span>
35}
;
36
37int  main()
38{
39  Machine myMachine;
40  // 构造完状态机后,它ƈ未开始运行。我们要通过调用它的initiate()来启动它?br>41  // 同时Q它也将触发它的初始状态(GreetingQ的构造?/span>
42  myMachine.initiate();
43  // 当我们离开main()函数ӞmyMachine被销毁,q将D它销毁它内部的所有活动的状态类?br>44  // Q译者注Qؓ什么会说所有?q是因ؓ一个状态机可以同时保持在多个状态中Q可以参?#8220;高主题”部分Q?/span>
45  return  0;
46}
q个E序会显C?#8220;Hello World!”?#8220; Bye Bye World! ”Q然后退出?/span>

2010-10-03 19:06 发表评论
]]>
vc7~译boost 1.33.1记录(?http://www.shnenglu.com/jack-wang/archive/2008/10/27/65217.htmlMon, 27 Oct 2008 08:53:00 GMThttp://www.shnenglu.com/jack-wang/archive/2008/10/27/65217.htmlhttp://www.shnenglu.com/jack-wang/comments/65217.htmlhttp://www.shnenglu.com/jack-wang/archive/2008/10/27/65217.html#Feedback0http://www.shnenglu.com/jack-wang/comments/commentRss/65217.htmlhttp://www.shnenglu.com/jack-wang/services/trackbacks/65217.html
接着copy bjam.exe?boost目录Q执行bjam -sBOOST_ROOT=. -sTOOLS=vc7 "-sBUILD=debug release <runtime-link>static/dynamic"

漫长的等待后会在boost目录下的bin文g夹中生一堆lib,复制到sdk的lib路径下,boost目录d的工E中。ok



上面是偶的经历,如果你不能编译成功,请参考下面的文章

原文Q?a >http://unknown-error.spaces.live.com/blog/cns!9B12A9BDE11A3428!142.entry#comment



如何开始用boost的跨q_thread?Windows)

boost主页Q?/font>http://www.boost.org/
在主늂击downloadq入sourceforge面下蝲Q当前最新版本ؓboost_1_33_1Q有多种文g格式可供下蝲(包括.exe, .tar.gz{?Q内容相同,都是boost_1_33_1的全部源代码。下载后解压(假设解压目录为D:\boost\boost_1_33_1)?/font>
 
boost中的大部分内定w可以直接源代码用,而thread则需要首先编译出对应的库?/font>
 
Windows XPq_Q?/font>
      我的机器上安装了vc2003和vc2005Q分别在D:\devenv\vs2003和D:\devenv\vs2005目录?/font>
1. ~译jamQJAM是编译其他库的基Q?br>启动命o行进入D:\boost\boost_1_33_1\tools\build\jam_src目录
q行build卛_
q行l束后,新出现bin.ntx86目录Q我们所需要的bjam.exe在该目录下?/font>
 
查看一下build文g的内容,发现其自动检vc2003(vc7.1)的安装目录,然后调用vc7.1~译出的bjam.exe。(使用了VS71COMNTOOLS宏)
 
2. ~译thread?/font>
启动命o行进入D:\boost\boost_1_33_1目录
set VC71_ROOT=D:\devenv\vs2003\Vc7  (此时没有自动,所以需要h工指?
tools\build\jam_src\bin.ntx86\bjam.exe --with-thread stage (只编译thread?
 
~译完成后,l果在D:\boost\boost_1_33_1\bin\boost\libs\thread\build目录下(包括debug/relase, dll/lib{)Q另外,׃我们在编译时使用了stage选项Q所以所有的l果都将被拷贝到D:\boost\boost_1_33_1\stage\lib目录下?/font>
 
ȝ一下,
动态库
libboost_thread-vc71-mt-gd-1_33_1.lib  +  boost_thread-vc71-mt-gd-1_33_1.dll (debug)      42.4k + 88.0k
libboost_thread-vc71-mt-1_33_1.lib     +  boost_thread-vc71-mt-1_33_1.dll    (release)    42.0k + 44.0k
静态库
libboost_thread-vc71-mt-gd-1_33_1.lib  (debug)    2.61M
libboost_thread-vc71-mt-1_33_1.lib     (release)  782k
静态库(runtime-link-static)
libboost_thread-vc71-mt-sgd-1_33_1.lib (debug)    2.19M
libboost_thread-vc71-mt-s-1_33_1.lib   (release)  692k

s Static link to runtime.
g Debug runtime.
d Debug enabled code.
 
 
3. 准备使用thread?/font>
    选用~译得到的thread动态库?/font>
    boost_thread-vc71-mt-gd-1_33_1.lib重命名ؓlibboost_thread-vc71-mt-gd-1_33_1.lib(前面加了lib)
    boost_thread-vc71-mt-1_33_1.lib重命名ؓlibboost_thread-vc71-mt-1_33_1.lib(前面加了lib)
    这两个文g拯到D:\devenv\vs2003\Vc7\PlatformSDK\Lib
 
    boost_thread-vc71-mt-gd-1_33_1.dll拯到windows的system32目录?/font>
    boost_thread-vc71-mt-1_33_1.dll拯到windows的system32目录?/font>
 
以上thread的debug/release版本的共享库拯到系l目录下Q接下去可以用了?/font>
 
4. 使用thread?/font>
    在vc2003中创Z个空的Win32 Console ProjectQ代码:
#include <boost/thread/thread.hpp>
#include <iostream>
void hello()
{
    std::cout << "Hello world, I'm a thread!" << std::endl;
}
main()
{
    boost::thread thrd(&hello);
    thrd.join();
}
 
    讄Project属性的Code Geneartion------Runtime Library ?/MDd 或?/MD
    讄Project属性的General-------Additional Include Directories?D:\boost\boost_1_33_1
 
    ~译q行卛_?/font>


2008-10-27 16:53 发表评论
]]>
˾þóۺӰԺ| þþֻоƷձ| ۺϾþҹAV | 2021þþƷ| 99þۺϺݺۺϾþֹ| þŷƷ| þþһƷ99þþƷ88| ŷҹAŴƬþ | һþöAV | þƵ| ݺ88ۺϾþþþۺ| þ޾ƷAV| vvaþ| ȫþվ| ˾þþƷһ| ɫþˬˬƬAV| ٸۺϾþĻ| ˾þۺӰԺ| ݺɫۺվþþþþþø | þþþavרˮ| þˬˬƬAV鷳 | ˾þþƷ| ѹ99þþ㽶| 91þþƷ91þɫ| þۺϸþúݺ97ɫ| þɧ| þùƷӰԺ| ھƷ˾þþþAVӰԺ| þ99ֻƵƷ8| þþŮ붯ȺëƬ | þۺϺݺۺϾþü | ˾þþƷ鶹һ| ˾Ʒþ| ݺ޾þþþþۺ| þҹɫƷ| Ʒ˾þþ| þþƷ| ޹þþۺվ | Ʒŷһþþ| ƷþþþþĻ| 99þҹҹƷ|