時間関連のユーティリティメソッドまとめ

Post to Google Buzz
このエントリーをはてなブックマークに追加
はてなブックマーク - 時間関連のユーティリティメソッドまとめ
Share on Facebook

Netduinoの場合、マイコンという性質上、普通の.NETプログラムに比べて、時間に関連したコードはかなり多い。が、意外にも時間にまつわるメソッドたちは少ない。ということで、毎回それなりに同じようなユーティリティメソッドを書くわけだが、それも煩雑なので、1つのクラスにまとめた。

ソースコード

このクラスは発展途上なので、たぶんメソッドが増えていきます。

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
55
56
57
58
59
60
61
62
63
/// <summary>
/// 時間に関するユーティリティクラス
/// </summary>
public static class TimeUtil
{
    /// <summary>
    /// 1[ms] が何 [Ticks] に相当するかを表します。Netduino では通常 10000[Ticks/ms] です。
    /// </summary>
    public const long TICKS_PER_MILLISECOND = System.TimeSpan.TicksPerMillisecond;
   
    /// <summary>
    /// 現在時刻をティックカウント [ms] で取得します。
    /// </summary>
    public static long TickMS
    {
        get { return DateTime.Now.Ticks / TICKS_PER_MILLISECOND; }
    }

    /// <summary>
    /// 指定したティックカウント [ms] からの経過時間をミリ秒で取得します。
    /// </summary>
    /// <param name="src"></param>
    /// <returns></returns>
    public static long GetElapsedMS(long src)
    {
        long current = TickMS;
        return current - src;
    }


    /// <summary>
    /// 機械時刻をティックカウントで取得します。
    /// </summary>
    /// <returns></returns>
    public static long GetMachineTimeTicks()
    {
        return Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks;
    }

    /// <summary>
    /// 指定した時間 [ms] 待機します。このメソッドは Thread.Sleep より少し正確ですが、精度は環境によります。
    /// 10[ms] 以上のタイムアウトには Thread.Sleep を使ってください。
    /// </summary>
    /// <param name="timeoutMilliseconds"></param>
    public static void SleepMS(long timeoutMilliseconds)
    {
        long target = DateTime.Now.Ticks + timeoutMilliseconds * TICKS_PER_MILLISECOND;
        while (DateTime.Now.Ticks >= target) ;
    }

    /// <summary>
    /// 指定した時間 [us] 待機します。このメソッドは 500[us] 程度の分解能で、1[ms] 以下の待機時間が必要なときに使用します。
    /// 2000[ms] 以上のタイムアウトには SleepMS や Thread.Sleep を使ってください。
    /// </summary>
    /// <param name="microseconds"></param>
    public static void SleepUS(double microseconds)
    {
        if (microseconds < 300) return;
        var start = GetMachineTimeTicks() - 3000;
        microseconds *= 10;
        while ((GetMachineTimeTicks() - start) < microseconds) ;
    }
}

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>