Develop and Download Open Source Software

Browse CVS Repository

Contents of /statemachinecxx/htdocs/tutorial.html

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (show annotations) (download) (as text)
Wed Sep 20 14:34:20 2006 UTC (17 years, 7 months ago) by t-suwa
Branch: MAIN
CVS Tags: HEAD
File MIME type: text/html
modified structure

1 <?xml version="1.0" encoding="euc-jp"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4 <html xmlns="http://www.w3.org/1999/xhtml">
5
6 <head>
7 <meta http-equiv="content-script-type" content="text/javascript" />
8 <meta http-equiv="content-type" content="text/html; charset=EUC-JP" />
9 <link rel="stylesheet" href="./statemachinecxx.css" media="all" type="text/css" />
10 <script type="text/javascript" src="./util.js"></script>
11 <title>Generic State Machine Library for C++ :: チュートリアル</title>
12 </head>
13
14 <body>
15
16 <h1><a href="./index.html">Generic State Machine Library for C++</a> :: チュートリアル</h1>
17
18 <div class="main">
19
20 <div class="popup" id="tooltip"></div>
21
22 <!--
23 <p id="id">ToolTip の文字列</p>
24 <span onMouseOut="hidetip();" onMouseOver="showtip('id', event);">tip のテスト</span>
25 <span onMouseOut="hidetip();" onMouseOver="showtip('a1', event);">tip のテスト</span>
26 -->
27
28 <h2>目次</h2>
29
30 <ul>
31 <li><a href="#1">Hello World!</a></li>
32 <li><a href="#2">ストップウオッチ</a></li>
33 </ul>
34
35 <h2><a name="1">Hello World!</a></h2>
36
37 <p>状態が一つだけの単純なモデルです。</p>
38
39 <h4>状態遷移図</h4>
40
41 <img src="./images/helloworld.png" />
42
43 <h4>コード</h4>
44
45 <!-- Generator: GNU source-highlight 2.1.2
46 by Lorenzo Bettini
47 http://www.lorenzobettini.it
48 http://www.gnu.org/software/src-highlite -->
49 <pre><tt><span onMouseOut="hidetip();" onMouseOver="showtip('1-1', event);"><span class="linenum">01:</span> <span class="preproc">#include</span><span class="normal"> </span><span class="string">&lt;iostream&gt;</span>
50 <span class="linenum">02:</span> <span class="preproc">#include</span><span class="normal"> </span><span class="string">"GenericStateMachine.h"</span></span>
51 <span class="linenum">03:</span>
52 <span onMouseOut="hidetip();" onMouseOver="showtip('1-4', event);"><span class="linenum">04:</span> <span class="keyword">using</span><span class="normal"> </span><span class="keyword">namespace</span><span class="normal"> statemachinecxx_sourceforge_jp</span><span class="symbol">;</span></span>
53 <span class="linenum">05:</span>
54 <span onMouseOut="hidetip();" onMouseOver="showtip('1-6', event);"><span class="linenum">06:</span> <span class="keyword">struct</span><span class="normal"> param </span><span class="cbracket">{</span><span class="cbracket">}</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> イベントパラメータ</span>
55 <span class="linenum">07:</span> <span class="keyword">struct</span><span class="normal"> result </span><span class="cbracket">{</span><span class="cbracket">}</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 処理結果</span></span>
56 <span class="linenum">08:</span>
57 <span class="linenum">09:</span> <span class="comment">//</span><span class="comment"> 状態コンテナクラス</span>
58 <span class="linenum">10:</span> <span class="keyword">struct</span><span class="normal"> Greeting </span><span class="cbracket">{</span>
59 <span class="linenum">11:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> ヘルパーマクロ(おっとっと! 看板に偽りあり、ですね ;-)</span>
60 <span onMouseOut="hidetip();" onMouseOver="showtip('1-12', event);"><span class="linenum">12:</span> <span class="normal"> </span><span class="function">DECLARE_StateContainer</span><span class="symbol">(</span><span class="normal">Greeting</span><span class="symbol">,</span><span class="normal"> param</span><span class="symbol">,</span><span class="normal"> result</span><span class="symbol">,</span><span class="normal"> entryPoint</span><span class="symbol">)</span><span class="symbol">;</span>
61 <span class="linenum">13:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 引数1:状態コンテナクラス名</span>
62 <span class="linenum">14:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 引数2:イベントパラメータ型名</span>
63 <span class="linenum">15:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 引数3:処理結果型名</span>
64 <span class="linenum">16:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 引数4:初期状態関数</span></span>
65 <span class="linenum">17:</span>
66 <span onMouseOut="hidetip();" onMouseOver="showtip('1-18', event);"><span class="linenum">18:</span> <span class="normal"> </span><span class="function">Greeting</span><span class="symbol">(</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
67 <span class="linenum">19:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="string">"construct Greeting"</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
68 <span class="linenum">20:</span> <span class="normal"> </span><span class="cbracket">}</span>
69 <span class="linenum">21:</span>
70 <span class="linenum">22:</span> <span class="normal"> </span><span class="symbol">~</span><span class="function">Greeting</span><span class="symbol">(</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
71 <span class="linenum">23:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="string">"destruct Greeting"</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
72 <span class="linenum">24:</span> <span class="normal"> </span><span class="cbracket">}</span></span>
73 <span class="linenum">25:</span>
74 <span class="linenum">26:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 状態関数 -- イベントを引数に取り、状態を返す</span>
75 <span onMouseOut="hidetip();" onMouseOver="showtip('1-27', event);"><span class="linenum">27:</span> <span class="normal"> State </span><span class="function">entryPoint</span><span class="symbol">(</span><span class="keyword">const</span><span class="normal"> Event</span><span class="symbol">&amp;</span><span class="normal"> event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span></span>
76 <span onMouseOut="hidetip();" onMouseOver="showtip('1-28', event);"><span class="linenum">28:</span> <span class="normal"> </span><span class="keyword">switch</span><span class="symbol">(</span><span class="normal">event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span></span>
77 <span onMouseOut="hidetip();" onMouseOver="showtip('1-29', event);"><span class="linenum">29:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> ENTRY_EVENT</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 入場時アクション</span>
78 <span class="linenum">30:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="string">"Hello World!"</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
79 <span class="linenum">31:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span>
80 <span onMouseOut="hidetip();" onMouseOver="showtip('1-32', event);"><span class="linenum">32:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> EXIT_EVENT</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 退場時アクション</span>
81 <span class="linenum">33:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="string">"Bye Bye World!"</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
82 <span class="linenum">34:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span>
83 <span class="linenum">35:</span> <span class="normal"> </span><span class="cbracket">}</span>
84 <span class="linenum">36:</span>
85 <span onMouseOut="hidetip();" onMouseOver="showtip('1-37', event);"><span class="linenum">37:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 処理しなかったイベントは上位状態(super state)で</span>
86 <span class="linenum">38:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> ハンドリングさせる</span>
87 <span class="linenum">39:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> State</span><span class="symbol">:</span><span class="symbol">:</span><span class="function">Super</span><span class="symbol">(</span><span class="symbol">&amp;</span><span class="normal">Greeting</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">TopState</span><span class="symbol">)</span><span class="symbol">;</span>
88 <span class="linenum">40:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> TopState は DECLARE_StateContainer が定義している</span></span>
89 <span class="linenum">41:</span> <span class="normal"> </span><span class="cbracket">}</span>
90 <span class="linenum">42:</span> <span class="cbracket">}</span><span class="symbol">;</span>
91 <span class="linenum">43:</span>
92 <span class="linenum">44:</span> <span class="type">int</span><span class="normal"> </span><span class="function">main</span><span class="symbol">(</span><span class="type">int</span><span class="normal"> argc</span><span class="symbol">,</span><span class="normal"> </span><span class="type">char</span><span class="symbol">*</span><span class="symbol">*</span><span class="normal"> argv</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
93 <span class="linenum">45:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="number">1</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
94 <span class="linenum">46:</span>
95 <span onMouseOut="hidetip();" onMouseOver="showtip('1-47', event);"><span class="linenum">47:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 状態機械を実体化する</span>
96 <span class="linenum">48:</span> <span class="normal"> GenericStateMachine</span><span class="symbol">&lt;</span><span class="normal">Greeting</span><span class="symbol">&gt;</span><span class="normal"> greeting</span><span class="symbol">;</span></span>
97 <span class="linenum">49:</span>
98 <span class="linenum">50:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="number">2</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
99 <span class="linenum">51:</span>
100 <span onMouseOut="hidetip();" onMouseOver="showtip('1-52', event);"><span class="linenum">52:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 起動</span>
101 <span class="linenum">53:</span> <span class="normal"> greeting</span><span class="symbol">.</span><span class="function">Start</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">;</span></span>
102 <span class="linenum">54:</span>
103 <span class="linenum">55:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="number">3</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
104 <span class="linenum">56:</span>
105 <span onMouseOut="hidetip();" onMouseOver="showtip('1-57', event);"><span class="linenum">57:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
106 <span class="linenum">58:</span> <span class="cbracket">}</span></span>
107 </tt></pre>
108
109 <h4>実行結果</h4>
110 <pre>1
111 construct Greeting
112 2
113 Hello World!
114 3
115 Bye Bye World!
116 destruct Greeting</pre>
117
118 <h4>解説</h4>
119
120 <table>
121 <tr>
122 <th>行番号</th><th>説明</th>
123 </tr>
124 <tr>
125 <td>1-2</td>
126 <td id='1-1'>ライブラリが提供するのは、"GenericStateMachine.h" だけです。</td>
127 </tr>
128 <tr>
129 <td>4</td>
130 <td id='1-4'>ライブラリの名前空間です。</td>
131 </tr>
132 <tr>
133 <td>6-7</td>
134 <td id='1-6'>イベントのパラメータと、処理結果をカスタマイズできます。<br />
135 このサンプルでは使わないので、空の構造体にしておきます。</td>
136 </tr>
137 <tr>
138 <td>12</td>
139 <td id='1-12'>状態コンテナクラスに必要な型や関数を定義するヘルパーマクロです。以下の型を定義します。<br />
140 <pre>typedef GenericState&lt;<em>状態コンテナクラス名</em>&gt; <strong>State</strong>;
141 typedef GenericEvent&lt;<em>イベントパラメータ型名</em>&gt; <strong>Event</strong>;
142 typedef State (<em>状態コンテナクラス名</em>::*<strong>Handler</strong>)(const Event&);
143 typedef <em>処理結果型名</em> <strong>Output</strong>;</pre>
144 また、最上位の状態関数も定義します。
145 <pre><strong>State TopState(const Event& event)</strong> {
146 switch(event) {
147 case INIT_EVENT:
148 return State::Initial(&<em>状態コンテナクラス名</em>::<em>初期状態関数</em>);
149 }
150 return 0;
151 }</pre>ヘルパーマクロの展開結果は、public である必要があります。</td>
152 </tr>
153 <tr>
154 <td>18-24</td>
155 <td id='1-18'>コンストラクタとデストラクタです。</td>
156 </tr>
157 <tr>
158 <td>27</td>
159 <td id='1-27'>状態関数です。状態関数のアドレスは、ヘルパーマクロの定義した Handler 型変数に格納できます。</td>
160 </tr>
161 <tr>
162 <td>28</td>
163 <td id='1-28'>Event クラスの <strong>int operator()</strong> を使ってイベントを判別します。</td>
164 </tr>
165 <tr>
166 <td>29-31</td>
167 <td id='1-29'>状態に入る時に発生するイベントです。<strong>イベントを処理をした場合は必ず 0</strong> を返します。
168 <br />状態関数のお約束です。</td>
169 </tr>
170 <tr>
171 <td>32-34</td>
172 <td id='1-32'>状態から抜ける時に発生するイベントです。<strong>イベントを処理をした場合は必ず 0</strong> を返します。
173 <br />状態関数のお約束です。</td>
174 </tr>
175 <tr>
176 <td>37-40</td>
177 <td id='1-37'>処理しなかったイベントに対しては、必ず <strong>State::Super(上位の状態関数のアドレス)</strong>
178 を返します。<br />状態関数のお約束です。</td>
179 </tr>
180
181 <tr>
182 <td>47-48</td>
183 <td id='1-47'>状態機械を Greeting で実体化します。Greeting のコンストラクタが実行されます。</td>
184 </tr>
185 <tr>
186 <td>52-53</td>
187 <td id='1-52'><strong>Start()</strong> で初期遷移を実行します。TopState から entryPoint へと状態遷移が行なわれます。
188 <br />entryPoint に対して ENTRY イベントが転送されます。</td>
189 </tr>
190 <tr>
191 <td>57-58</td>
192 <td id='1-57'>entryPoint に対して EXIT イベントが転送されます。
193 <br />最後に、Greeting のデストラクタが呼び出されます。</td>
194 </tr>
195 </table>
196
197 <h2><a name="2">ストップウォッチ</a></h2>
198
199 <p>STARTSTOP と RESET ボタンを備えたストップウオッチのモデルです。</p>
200
201 <h4>状態遷移図</h4>
202
203 <img src="./images/stopwatch.png" />
204
205 <h4>コード</h4>
206
207 <!-- Generator: GNU source-highlight 2.1.2
208 by Lorenzo Bettini
209 http://www.lorenzobettini.it
210 http://www.gnu.org/software/src-highlite -->
211 <pre><tt><span class="linenum">01:</span> <span class="preproc">#include</span><span class="normal"> </span><span class="string">&lt;iostream&gt;</span>
212 <span class="linenum">02:</span> <span class="preproc">#include</span><span class="normal"> </span><span class="string">"GenericStateMachine.h"</span>
213 <span class="linenum">03:</span>
214 <span class="linenum">04:</span> <span class="keyword">using</span><span class="normal"> </span><span class="keyword">namespace</span><span class="normal"> statemachinecxx_sourceforge_jp</span><span class="symbol">;</span>
215 <span class="linenum">05:</span>
216 <span class="linenum">06:</span> <span class="keyword">struct</span><span class="normal"> param </span><span class="cbracket">{</span><span class="cbracket">}</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> イベントパラメータは使わない</span>
217 <span onMouseOut="hidetip();" onMouseOver="showtip('2-7', event);"><span class="linenum">07:</span> <span class="keyword">struct</span><span class="normal"> result </span><span class="cbracket">{</span><span class="normal"> </span><span class="type">int</span><span class="normal"> elapsed</span><span class="symbol">;</span><span class="normal"> </span><span class="cbracket">}</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 処理結果</span></span>
218 <span class="linenum">08:</span>
219 <span onMouseOut="hidetip();" onMouseOver="showtip('2-9', event);"><span class="linenum">09:</span> <span class="comment">//</span><span class="comment"> ユーザー定義イベント</span>
220 <span class="linenum">10:</span> <span class="keyword">enum</span><span class="normal"> </span><span class="cbracket">{</span>
221 <span class="linenum">11:</span> <span class="normal"> STARTSTOP </span><span class="symbol">=</span><span class="normal"> USER_EVENT</span><span class="symbol">,</span>
222 <span class="linenum">12:</span> <span class="normal"> RESET</span><span class="symbol">,</span>
223 <span class="linenum">13:</span> <span class="cbracket">}</span><span class="symbol">;</span></span>
224 <span class="linenum">14:</span>
225 <span class="linenum">15:</span> <span class="keyword">struct</span><span class="normal"> StopWatch </span><span class="cbracket">{</span>
226 <span class="linenum">16:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> ヘルパーマクロ</span>
227 <span class="linenum">17:</span> <span class="normal"> </span><span class="function">DECLARE_StateContainer</span><span class="symbol">(</span><span class="normal">StopWatch</span><span class="symbol">,</span><span class="normal"> param</span><span class="symbol">,</span><span class="normal"> result</span><span class="symbol">,</span><span class="normal"> Stopped</span><span class="symbol">)</span><span class="symbol">;</span>
228 <span class="linenum">18:</span>
229 <span onMouseOut="hidetip();" onMouseOver="showtip('2-19', event);"><span class="linenum">19:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 結果を初期化</span>
230 <span class="linenum">20:</span> <span class="normal"> </span><span class="function">StopWatch</span><span class="symbol">(</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span><span class="normal"> result_</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span><span class="normal"> </span><span class="cbracket">}</span></span>
231 <span class="linenum">21:</span>
232 <span class="linenum">22:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 停止状態</span>
233 <span class="linenum">23:</span> <span class="normal"> State </span><span class="function">Stopped</span><span class="symbol">(</span><span class="keyword">const</span><span class="normal"> Event</span><span class="symbol">&amp;</span><span class="normal"> event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
234 <span class="linenum">24:</span> <span class="normal"> </span><span class="keyword">switch</span><span class="symbol">(</span><span class="normal">event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
235 <span onMouseOut="hidetip();" onMouseOver="showtip('2-25', event);"><span class="linenum">25:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> STARTSTOP</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 状態遷移</span>
236 <span class="linenum">26:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="string">"*** start ***"</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
237 <span class="linenum">27:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> State</span><span class="symbol">:</span><span class="symbol">:</span><span class="function">Transition</span><span class="symbol">(</span><span class="symbol">&amp;</span><span class="normal">StopWatch</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">Running</span><span class="symbol">)</span><span class="symbol">;</span></span>
238 <span onMouseOut="hidetip();" onMouseOver="showtip('2-28', event);"><span class="linenum">28:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> RESET</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 内部遷移(リセット)</span>
239 <span class="linenum">29:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="string">"*** reset ***"</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
240 <span class="linenum">30:</span> <span class="normal"> result_</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
241 <span class="linenum">31:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span>
242 <span class="linenum">32:</span> <span class="normal"> </span><span class="cbracket">}</span>
243 <span class="linenum">33:</span>
244 <span onMouseOut="hidetip();" onMouseOver="showtip('2-34', event);"><span class="linenum">34:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> State</span><span class="symbol">:</span><span class="symbol">:</span><span class="function">Super</span><span class="symbol">(</span><span class="symbol">&amp;</span><span class="normal">StopWatch</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">TopState</span><span class="symbol">)</span><span class="symbol">;</span></span>
245 <span class="linenum">35:</span> <span class="normal"> </span><span class="cbracket">}</span>
246 <span class="linenum">36:</span>
247 <span class="linenum">37:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 計測状態</span>
248 <span class="linenum">38:</span> <span class="normal"> State </span><span class="function">Running</span><span class="symbol">(</span><span class="keyword">const</span><span class="normal"> Event</span><span class="symbol">&amp;</span><span class="normal"> event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
249 <span class="linenum">39:</span> <span class="normal"> </span><span class="keyword">switch</span><span class="symbol">(</span><span class="normal">event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
250 <span onMouseOut="hidetip();" onMouseOver="showtip('2-40', event);"><span class="linenum">40:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> ENTRY_EVENT</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 計測を開始</span>
251 <span class="linenum">41:</span> <span class="normal"> start_ </span><span class="symbol">=</span><span class="normal"> </span><span class="function">time</span><span class="symbol">(</span><span class="number">0</span><span class="symbol">)</span><span class="symbol">;</span>
252 <span class="linenum">42:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span>
253 <span onMouseOut="hidetip();" onMouseOver="showtip('2-43', event);"><span class="linenum">43:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> EXIT_EVENT</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 計測を終了</span>
254 <span class="linenum">44:</span> <span class="normal"> result_</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol">+</span><span class="symbol">=</span><span class="normal"> </span><span class="function">time</span><span class="symbol">(</span><span class="number">0</span><span class="symbol">)</span><span class="normal"> </span><span class="symbol">-</span><span class="normal"> start_</span><span class="symbol">;</span>
255 <span class="linenum">45:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="string">"RESULT: "</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> result_</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
256 <span class="linenum">46:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span>
257 <span onMouseOut="hidetip();" onMouseOver="showtip('2-47', event);"><span class="linenum">47:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> STARTSTOP</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 状態遷移</span>
258 <span class="linenum">48:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> State</span><span class="symbol">:</span><span class="symbol">:</span><span class="function">Transition</span><span class="symbol">(</span><span class="symbol">&amp;</span><span class="normal">StopWatch</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">Stopped</span><span class="symbol">)</span><span class="symbol">;</span></span>
259 <span onMouseOut="hidetip();" onMouseOver="showtip('2-49', event);"><span class="linenum">49:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> RESET</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 内部遷移(LAP 計測)</span>
260 <span class="linenum">50:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="string">"LAP: "</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="function">time</span><span class="symbol">(</span><span class="number">0</span><span class="symbol">)</span><span class="normal"> </span><span class="symbol">-</span><span class="normal"> start_ </span><span class="symbol">+</span><span class="normal"> result_</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span>
261 <span class="linenum">51:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span>
262 <span class="linenum">52:</span> <span class="normal"> </span><span class="cbracket">}</span>
263 <span class="linenum">53:</span>
264 <span onMouseOut="hidetip();" onMouseOver="showtip('2-54', event);"><span class="linenum">54:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> State</span><span class="symbol">:</span><span class="symbol">:</span><span class="function">Super</span><span class="symbol">(</span><span class="symbol">&amp;</span><span class="normal">StopWatch</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">TopState</span><span class="symbol">)</span><span class="symbol">;</span></span>
265 <span class="linenum">55:</span> <span class="normal"> </span><span class="cbracket">}</span>
266 <span class="linenum">56:</span>
267 <span onMouseOut="hidetip();" onMouseOver="showtip('2-57', event);"><span class="linenum">57:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 処理結果</span>
268 <span class="linenum">58:</span> <span class="normal"> </span><span class="keyword">const</span><span class="normal"> Output</span><span class="symbol">&amp;</span><span class="normal"> </span><span class="function">Result</span><span class="symbol">(</span><span class="symbol">)</span><span class="normal"> </span><span class="keyword">const</span><span class="normal"> </span><span class="cbracket">{</span>
269 <span class="linenum">59:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> result_</span><span class="symbol">;</span>
270 <span class="linenum">60:</span> <span class="normal"> </span><span class="cbracket">}</span></span>
271 <span class="linenum">61:</span>
272 <span class="linenum">62:</span> <span class="keyword">private</span><span class="symbol">:</span>
273 <span class="linenum">63:</span> <span class="normal"> result result_</span><span class="symbol">;</span>
274 <span class="linenum">64:</span> <span class="normal"> time_t start_</span><span class="symbol">;</span>
275 <span class="linenum">65:</span> <span class="cbracket">}</span><span class="symbol">;</span>
276 <span class="linenum">66:</span>
277 <span class="linenum">67:</span> <span class="type">int</span><span class="normal"> </span><span class="function">main</span><span class="symbol">(</span><span class="type">int</span><span class="normal"> argc</span><span class="symbol">,</span><span class="normal"> </span><span class="type">char</span><span class="symbol">*</span><span class="symbol">*</span><span class="normal"> argv</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
278 <span onMouseOut="hidetip();" onMouseOver="showtip('2-68', event);"><span class="linenum">68:</span> <span class="normal"> GenericStateMachine</span><span class="symbol">&lt;</span><span class="normal">StopWatch</span><span class="symbol">&gt;</span><span class="normal"> sw</span><span class="symbol">;</span>
279 <span class="linenum">69:</span>
280 <span class="linenum">70:</span> <span class="normal"> sw</span><span class="symbol">.</span><span class="function">Start</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">;</span></span>
281 <span class="linenum">71:</span>
282 <span class="linenum">72:</span> <span class="normal"> </span><span class="keyword">while</span><span class="symbol">(</span><span class="keyword">true</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
283 <span onMouseOut="hidetip();" onMouseOver="showtip('2-73', event);"><span class="linenum">73:</span> <span class="normal"> </span><span class="type">char</span><span class="normal"> ch</span><span class="symbol">;</span>
284 <span class="linenum">74:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="string">"command(s:start/stop, r:reset, q:quit)&gt; "</span><span class="symbol">;</span>
285 <span class="linenum">75:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cin </span><span class="symbol">&gt;</span><span class="symbol">&gt;</span><span class="normal"> ch</span><span class="symbol">;</span>
286 <span class="linenum">76:</span> <span class="normal"> </span><span class="keyword">if</span><span class="symbol">(</span><span class="normal">ch </span><span class="symbol">=</span><span class="symbol">=</span><span class="normal"> </span><span class="string">'q'</span><span class="symbol">)</span><span class="normal"> </span><span class="keyword">break</span><span class="symbol">;</span></span>
287 <span class="linenum">77:</span> <span class="normal"> </span><span class="keyword">switch</span><span class="symbol">(</span><span class="normal">ch</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span>
288 <span onMouseOut="hidetip();" onMouseOver="showtip('2-78', event);"><span class="linenum">78:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> </span><span class="string">'s'</span><span class="symbol">:</span>
289 <span class="linenum">79:</span> <span class="normal"> sw</span><span class="symbol">.</span><span class="function">Dispatch</span><span class="symbol">(</span><span class="normal">STARTSTOP</span><span class="symbol">)</span><span class="symbol">;</span>
290 <span class="linenum">80:</span> <span class="normal"> </span><span class="keyword">break</span><span class="symbol">;</span>
291 <span class="linenum">81:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> </span><span class="string">'r'</span><span class="symbol">:</span>
292 <span class="linenum">82:</span> <span class="normal"> sw</span><span class="symbol">.</span><span class="function">Dispatch</span><span class="symbol">(</span><span class="normal">RESET</span><span class="symbol">)</span><span class="symbol">;</span>
293 <span class="linenum">83:</span> <span class="normal"> </span><span class="keyword">break</span><span class="symbol">;</span></span>
294 <span class="linenum">84:</span> <span class="normal"> </span><span class="cbracket">}</span>
295 <span class="linenum">85:</span> <span class="normal"> </span><span class="cbracket">}</span>
296 <span class="linenum">86:</span>
297 <span onMouseOut="hidetip();" onMouseOver="showtip('2-87', event);"><span class="linenum">87:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> </span><span class="string">"Elapsed="</span><span class="normal"> </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> sw</span><span class="symbol">.</span><span class="function">Result</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol">&lt;</span><span class="symbol">&lt;</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span></span>
298 <span class="linenum">88:</span>
299 <span class="linenum">89:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span>
300 <span class="linenum">90:</span> <span class="cbracket">}</span>
301 </tt></pre>
302
303 <h4>実行結果</h4>
304
305 <pre>$ ./a.out
306 command(s:start/stop, r:reset, q:quit)> s
307 *** start ***
308 command(s:start/stop, r:reset, q:quit)> r
309 LAP: 2
310 command(s:start/stop, r:reset, q:quit)> r
311 LAP: 4
312 command(s:start/stop, r:reset, q:quit)> s
313 RESULT: 5
314 command(s:start/stop, r:reset, q:quit)> s
315 *** start ***
316 command(s:start/stop, r:reset, q:quit)> s
317 RESULT: 7
318 command(s:start/stop, r:reset, q:quit)> r
319 *** reset ***
320 command(s:start/stop, r:reset, q:quit)> s
321 *** start ***
322 command(s:start/stop, r:reset, q:quit)> s
323 RESULT: 2
324 command(s:start/stop, r:reset, q:quit)> q
325 Elapsed=2
326 $</pre>
327
328 <h4>解説</h4>
329
330 <table>
331 <tr>
332 <th>行番号</th><th>説明</th>
333 </tr>
334 <tr>
335 <td>7</td>
336 <td id='2-7'>処理結果型を定義してます。状態コンテナクラスの Result() メソッドでこの構造体の const 参照を得ることができます。</td>
337 </tr>
338 <tr>
339 <td>9-13</td>
340 <td id='2-9'>ユーザーイベント用の識別子として STARTSTOP と RESET を定義しています。
341 <br />USER_EVENT はライブラリが定義しているユーザーイベント用の初期値です。
342 <br />この初期値によって、ENTRY や EXIT など他のライブラリ定数と衝突しないことを保証できます。</td>
343 </tr>
344 <tr>
345 <td>19-20</td>
346 <td id='2-19'>処理結果を初期化します。</td>
347 </tr>
348 <tr>
349 <td>25-27</td>
350 <td id='2-25'>STARTSTOP イベントをハンドリングしています。状態遷移をする時のお約束は、
351 <br /><strong>State::Transition(状態関数のアドレス)</strong> を返すことです。</td>
352 </tr>
353 <tr>
354 <td>28-31</td>
355 <td id='2-28'>RESET イベントで経過時間を 0 にリセットします。</td>
356 </tr>
357
358 <tr>
359 <td>34</td>
360 <td id='2-34'>状態関数のお約束です。</td>
361 </tr>
362
363 <tr>
364 <td>40-42</td>
365 <td id='2-40'>ENTRY イベントです。計測を開始します。</td>
366 </tr>
367 <tr>
368 <td>43-46</td>
369 <td id='2-43'>EXIT イベントです。計測を終了します。</td>
370 </tr>
371
372 <tr>
373 <td>47-48</td>
374 <td id='2-47'>Stopped に状態遷移しています。この次に、EXIT イベントが発生します。</td>
375 </tr>
376 <tr>
377 <td>49-51</td>
378 <td id='2-49'>RESET イベントで LAP を計測しています。</td>
379 </tr>
380
381 <tr>
382 <td>54</td>
383 <td id='2-54'>状態関数のお約束です。</td>
384 </tr>
385
386 <tr>
387 <td>57-60</td>
388 <td id='2-57'>処理結果型への const 参照を返します。</td>
389 </tr>
390
391 <tr>
392 <td>68-70</td>
393 <td id='2-68'>実体化と初期遷移です。Stopped 状態に遷移します。</td>
394 </tr>
395
396 <tr>
397 <td>73-76</td>
398 <td id='2-73'>コマンドを処理しています。</td>
399 </tr>
400 <tr>
401 <td>78-83</td>
402 <td id='2-78'><strong>Dispatch()</strong> を呼び出して、イベントを転送しています。</td>
403 </tr>
404 <tr>
405 <td>87</td>
406 <td id='2-87'><strong>Reseult()</strong> を呼び出して、処理結果を取得しています。</td>
407 </tr>
408
409 </table>
410
411 </div>
412
413 <div class="sidebar">
414 <script type="text/javascript">lastupdate("$Date: 2006/09/17 09:41:04 $");</script>
415 <script type="text/javascript" src="./sidebar.js"></script>
416 </div>
417
418 <div class="footer">
419 <p>Copyright &copy; 2006 Tomotaka SUWA All Rights Reserved.</p>
420 </div>
421
422 </body>
423 </html>

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26