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) ; } } |