.NET Micro FrameworkのTimerクラス

2011/11/8に公開された@IT Monoistの記事、「.NET Micro FrameworkデバイスとWindows Phoneをつなぐ」の2/2で紹介した、Timerに関する使い方で読者から質問があったようなので、ここで紹介しておきます。

記事にも書いたとおり、.NET Micro Frameworkは超小型デバイス向けのフレームワークなので、その他の.NET Frameworkとはクラスやクラスのメンバー構成が結構異なっています。このあたり、PCやWeb、Windows Phoneで開発を行っていた方が、.NET Micro Frameworkをはじめる時に戸惑うポイントかもしれません。.NET Micro Framework SDKをインストールすると、

C:\Program Files (x86)\Microsoft .NET Micro Framework\{Version}\Documentation\NET MicroFramework Docs

に、PSDKというヘルプファイルが出来上がります。このヘルプファイルの中にAPIのリファレンスがあるので、使いたいクラスを探す時にはこちらを参照してみてください。
このドキュメントで、Timerクラスのコンストラクタの項を見ると、

Timer(TimerCallback, Object, Int32, Int32)

Timer(TimerCallback, Object, TimeSpan, TimeSpan)

という二つのシグネチャーのコンストラクタが用意されています。どちらも、一から順に、タイマーが発火した時に呼んでもらうコールバックメソッドと、コールバックメソッドに渡したい変数(無い時はnull)、インスタンスを作ってから、最初に発火するまでの時間、発火時間間隔を意味しています。最初のシグネチャーのコンストラクターは、3、4番目の引数がミリ秒単位指定、二番目のシグネチャーのコンストラクターは、3、4番目の引数が時間間隔を表すTimeSpanという構造体のインスタンスを指定した形になっています。記事のリスト3は、この2番目のシグネチャーを使ってTimerインスタンスを生成しているわけです。

このTimeSpan構造体は結構便利。メンバーの定義を覗いてみると、システムが扱える最大時間間隔や最小時間間隔の値(それぞれ、MaxValue、MinValue)、1日や1時間、一分間がシステムのTick数でどれだけの値になるかを知ることが出来るプロパティ、日付や分数、秒数を相互に変換できる機能や、時間の比較や足算引数用オペレーター、時間定義を便利にする各種メソッドなど、組込みデバイスで時間を扱うのに便利な機能が多数用意されています。

記事のリスト3では、この中のFromTickPerMinuteの、staticなプロパティを使っていますが、これは、一分間と同じTick数を格納するTimeSpanインスタンスを取得できるプロパティで、結局、リスト3では、1分間隔でタイマーを発火し、最初の発火は1分後であることを指定しているわけですね。

それから、他の.NET Frameworkで提供されるTimerクラスは、インスタンス生成→ハンドラ登録→Startメソッドコール、という手順でタイマーを起動しますが、.NET Micro FrameworkのTimerは、コンストラクターでインスタンスを生成すると即タイマー起動、であることにも注意をしてください。多分、超小型組込みデバイス向けのファームウェアなので、なるべくコンパクトなコードが書けるようにとの配慮でしょう。

このポストは以上です。もう2、3個関連ブログをポストの予定です。