System::Timers::Timerの使い方

元気にしてたかい、子供たち?C++/CLI使ってる?今日はSystem::Timers::Timerの使い方についてのお話だよ。あれ、どうしたんだい?最近子供たちの元気がないから子供たちが病気になってしまったんじゃないかとおじさんは心配しているんだよ。
いつものように空のCLRプロジェクトを作成して、ソリューションエクスプローラでプロジェクトのとこを右クリック、参照で、Systemや、System::Windows::Formsのコンポーネントを追加した後に、以下のコードを打ち込んで実行するだけだ。コードの中でやってることは以下のようなことだよ。

  • タイマーの作成と、タイマーコールバックを持つテストクラスを用意
  • タイマーのElapsedイベントに、上記テストクラスのコールバックメソッドを関連付けたTimers::ElapsedEventHandler型のデリゲートを追加
  • タイマーのインターバルを設定
  • タイマーを始動!(AutoResetをtrueにしないと一回しかコールバックが呼ばれないから注意!)

どうだろう?とっても簡単だね!
ところで、タイマーコールバックは、タイマーが起動されたスレッドとは別のスレッドとして実行されるので、Formのコントロールなど、UIに何かしたい場合は注意が必要だよ。
それはThreading::Timerを使う場合でも同じかもね!じゃ、また!

using namespace ::System;
using namespace ::System::Windows;
using namespace ::System::Windows::Forms;

// コールバックの定義
public ref class TimerTest
{
public:
    TimerTest( void ){}
    void SayYeah( System::Object^ obj, System::Timers::ElapsedEventArgs^ args ){
	System::Console::WriteLine( "yeah" );
	return;
    }
};

// タイマーの作成、設定、起動、終了
void main( void )
{
  TimerTest^ tt = gcnew TimerTest;
  System::Timers::Timer^ timer = gcnew System::Timers::Timer();
  {
    timer->Interval = 1000;
    timer->AutoReset = !0;
    timer->Elapsed += 
        gcnew System::Timers::ElapsedEventHandler( tt, &TimerTest::SayYeah );
    timer->Start();
  }
  Console::WriteLine( "press return key to exit" );
  Console::ReadLine();
  delete tt;
  return;
}


追伸:
その後、.NET開発環境で利用可能なタイマーの中でも精度がもっともよいと言われているSystem::Timers::Timerだけど、Win32のマルチメディアタイマーにはかなわないという報告も読んだりして、おじさんはとっても心配しているよ。もし子供たちのなかでも情報を持ってる人がいたら、どうかおじさんに教えてくれないか。よろしく!