概要 anchor.png Edit

時間計測用クラス「StopWatch」について解説します。*1

Page Top

ポイント anchor.png Edit

StopWatchは以下のメソッドを持っていて、それぞれ実際のストップウォッチの使い方と対応しています。

  • start() ⇔ スタートボタンを押す/一時停止からの復帰
  • stop() ⇔ ストップボタンを押す/一時停止する
  • peek() ⇔ ディスプレイを見て経過時間を知る
  • reset() ⇔ リセットボタンを押す

また、コンストラクタにautoStartを指定することで自動的にストップウォッチをstart()します。

peek()して得られるTickDuration構造体は以下に挙げるように、toテンプレート関数で任意の単位、型で得ることができます。

  • to!("seconds", real) でミリ秒を実数で
  • to!("usecs", real) でマイクロ秒を実数で
  • to!("seconds", int) で秒数を整数で
  • to!("msecs", int) でミリ秒を整数で
  • to!("usecs", int) でマイクロ秒を整数で

それぞれ得ることが出来ます。

整数で得る場合は、別途別名が付けられています。

  • seconds
  • msecs
  • usecs
  • hnsecs*2
  • nsecs
Page Top

サンプルコード anchor.png Edit

本サンプルコードは、非常に単純なタイピングゲームをStopWatchを使って実装しています。

Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 
 
 
 
 
 
-
|
|
-
!
|
|
-
|
|
-
!
|
-
!
|
|
-
-
!
|
-
|
|
|
!
|
-
|
|
-
|
!
|
-
!
!
!
-
!
!
-
!
|
|
|
|
!
import std.stdio;
import std.random;
import std.string;
import std.datetime;
 
void main()
{
    writeln("start");
    enum names = ["yui", "ritsu", "mio", "tsumugi", "azusa"];
    // ストップウォッチの変数定義
    StopWatch sw;
    real[] times;
    while(1)
    {
        auto i = uniform(0, names.length);
        write(names[i], " : ");
        // ストップウォッチをスタート。文字の入力の秒数を測る。
        sw.start();
        auto x = chop(readln());
        // ストップウォッチをストップ。入力以外の時間は測りたくない。
        sw.stop();
        if (x == "exit") break;
        while (1)
        {
            // 時間を秒数で取得
            real time = sw.peek().to!("seconds", real);
            if (names[i] == x)
            {
                writeln("Correct!: ", time);
                times ~= time;
                break;
            }
            else
            {
                writeln("Incorrect!: ", time);
                write(names[i], " : ");
                // 間違っていた場合はもう一度測る。
                // reset()していないので、さっきの続きから図る。
                sw.start();
                x = chop(readln());
                // またストップ。
                sw.stop();
            }
        }
        // 正解するとここに来るので、リセットする。
        sw.reset();
    }
    // 平均値を算出
    real sum = 0;
    foreach (e; times) sum += e;
    writeln("Average: ", sum/times.length);
    
    writeln("end");
}
Page Top

実行結果 anchor.png Edit

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
$ dmd -run main
start
azusa : azusa
Correct!: 1.32781
yui : yui
Correct!: 1.76353
tsumugi : tsumugi
Correct!: 1.84
mio : mio
Correct!: 1.06411
mio : mio
Correct!: 1.10792
ritsu : ritsu
Correct!: 1.6466
mio : mio
Correct!: 1.04965
yui : yui
Correct!: 1.93605
mio : mio
Correct!: 1.10735
ritsu : ritsu
Correct!: 1.75133
mio : mio
Correct!: 1.12945
azusa : azusa
Correct!: 1.507
tsumugi : tsumugi
Correct!: 1.73608
mio : mio
Correct!: 1.05388
azusa : azusa
Correct!: 1.39997
mio : mio
Correct!: 1.10782
azusa : azusa
Correct!: 1.51533
mio : mio
Correct!: 1.10426
yui : yui
Correct!: 1.21806
tsumugi : tsumugi
Correct!: 1.70366
yui : yui
Correct!: 1.27593
tsumugi : tsumugi
Correct!: 1.72524
ritsu : ritsu
Correct!: 2.60032
tsumugi : exit
Average: 1.46397
end

Page Top

投票とコメント anchor.png Edit

Choices Vote
大変参考になった5  
参考になった0  
あまり参考にならなかった0  
まったく参考にならなかった0  

Show recent 10 comments. Go to the comment page.

  • 「secondsで秒数を実数で得ることが可能」なのに、「整数で得る場合は~」のところにsecondsがあり、矛盾しています。 -- ゲストEdit 2011-03-20 (日) 12:56:42
  • 対応しました -- SHOOEdit 2011-03-23 (水) 19:31:00
Name:

*1 ただし、StopWatchは ver.2.052 以降です。
*2 ヘクトナノ秒 == ナノ秒の100倍の長さ == 1/10000000秒単位

Front page   Edit Freeze Diff Backup Upload Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 3042, today: 2, yesterday: 0
Princeps date: 2011-03-23 (Wed) 19:31:00
Last-modified: 2011-03-23 (Wed) 19:31:00 (JST) (3956d) by ゲスト
メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu