Timerの設置 HOME > 絵を描く > Timerの設置

06.02 Timerの設置

6.1でウィンドウに決まった図形を表示できるようになりましたが、これから作成しようとしているのは「動くもの」であり

    動かなくてはいけない!

「動く」ということはどういうことか考えてみましょう。
例えばテレビや動画というのは、高速で静止画が入れ替わると人間の目の錯覚により連続的に動いているように見えます。

    その為にはどうしたらよいでしょうか?

こんな例題をやってみましょう。
下記はボタンをクリックすると現在の日時が出てくるプログラムです。ちょっと内容を解説すると、

ボタンコントロールから押下時に起動するbutton1_Ckick内にDisplayWatch()という関数が呼ばれ内容は、

    DateTime localDate = DateTime::Now;

Date構造体は日時を表現できる構造体です。
Nowプロパティは現在の日付とローカルコンピュータの時間を合わせて表す値となり、最後にtextBox1のテキスト領域へ文字列化して代入しています。
すると、その下にあるようにbutton1を押下すると日時が表示されます。

しかし、このプログラムはフレームタイトルにもある「Watch(時計)」として機能するでしょうか?
これは単に押下した際の一瞬の時間を表示するだけで時計としては機能しません。


機能させるためには「動かないといけない」わけです。




  void  DisplayWatch(void)
  {
    DateTime localDate = DateTime::Now;
    textBox1->Text = localDate.ToString();
  }
  private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
  {
    DisplayWatch();
  }






★Timerとは何か?
こんな時に有効なものがVisualStudioには用意されています。

それが「タイマー(Timer)コントロール」と呼ばれているものです。

タイマーは「キッチンタイマー」と同じで、ミリ秒単位で時間を設定すると、その時間が来ると処理を行ってくれます。


詳しく解説するとコンピュータ全てが基本的には「クロック」という時間を基準に動作しており、パソコンを購入されるときに「このパソコンのCPUはインテルXXギガヘルツの高速機で」とかいう話やカタログをご覧になったことがあると思いますが、「ヘルツ」は一秒間に振動する数を指し、値の大きさに比例して動作も速くなります。この振動しているものが、言ってみれば「時計」=「クロック」なわけです。さらにこれに加えパソコンの場合、カレンダーICというICを別系統で持っており日時はここで管理しています。
前述のNowプロパティの記述が「Nowプロパティは現在の日付とローカルコンピュータの時間を合わせて表す値」と妙な言い回しなのは、その為で時間に関しては「出所」が複数あり、「ローカルコンピュータの時間」というように具体的に記載されているわけです。

さてなんで、ここで小難しい話題を出したかというと、このタイマーにも弱点があります。
ここで使用する時計(クロック)はアプリケーションが受け取る際、これ以下は使用できないという単位を持っていて、その最小単位を「ティック(Tick)」といいます。俗にティックタイムなどといい上記記述だと「ミリ単位で時間を設定できます」の部分に関係し最小単位は「ミリ秒」だとわかります。ハードウエアを自由に制御できるアプリケーションであれば変更できるかもしれませんが、現行システムは「windows」というOSの支配下にあり変更はできません。さらに一般PCの場合そんなに高速でタイマーを起動する必要が今までなかったために、ウィンドウズは一般ユーザが使用できる最小単位が数十ミリ秒、さらに他のアプリケーションの影響もあり きっちり周期が保証される時間は数百ミリ秒程度です。 このため上記記述がミリ秒と記載されていても、1ミリ秒とか小さな値を指定しても動作しないので注意してください。


★アニメーション
小難しいティックタイムについて長々と書きましたが、非常に重要なのです。
というのも例えばテレビ・映画・パソコンもすべてが動画なわけです、ということは静止画が一定の時間で切り替わっているわけで、これを俗に「フレームレート」なんていう言葉で表現します。

ウィキペディア「フレームレート」解説 引用
「フレームレートは、動画において、単位時間あたりに処理させるフレーム数(静止画像数、コマ数)である。通常、1秒あたりの数値で表し、fps(英: frames per second=フレーム毎秒)という単位で表す。 映像に対するサンプリング周波数とも言え、単位にヘルツが使われる場合もある。連続しているものに対する標本化であることからストロボ効果を起こす。 走査がプログレッシブスキャンであればリフレッシュレートと同じ値になる。ただし、リフレッシュレートとは違うものである。特にアナログテレビ放送のNTSCなどインターレースの場合、フレームレートはリフレッシュレートとは一致しない。 」


この単位は「1秒間当たりの画面数」で表し前例の場合

    テレビ・パソコンの場合    29.97fps
    映画                                 24fps
    HDTV                               60fps

1フレームが変更される時間間隔は、
    テレビ・パソコンの場合    33.37ミリ秒
    映画                                 44.67ミリ秒
    HDTV                               16.67ミリ秒

つまり少なくとも映画並みのアニメーションを実現するためには、少なくとも周期は45ミリ秒程度にする必要があるということなのです。


★タイマーコントロール
タイマーコントロールは一定の「テンポ」を刻んでイベントを発行しますが、前述のようにこれを「ティック(tick)」といい、このイベントを「ティックイベント」といいます。ティックを利用してイベントを発行するまでの時間は「Intervalプロパティ」(初期値100ミリ秒)で決定されミリ秒で決定されますが前述のような暗黙の決まりごとがあるため、あまり小さな値は設定しても正確に動作しません。起動停止は「Enabledプロパティ」が「true」で起動、「false」で停止します。また、このイベントは一旦「Enabledプロパティ」を「true」で起動するとウィンドウを閉じるまで起動し続けます。



★Timerを設置する
では前述のボタンをクリックすると時間が表示するプログラムにタイマーを追加して「時計を作ってみましょう」。
実はタイマーには3種類あるのですが、ここでは具体的な事には触れず、オーソドックスな方法で追加してみましょう。

タイマーはツールボックスの中の「コンポーネント」→「Timer」があります。


さて!ここで注意することは今までのように画面に張り付けて見ることができる部品ではなく、内部で機能する構成要素=コンポーネントでありますので、同じようにドラッグしてくるのですが、画面内部には張り付きません。そこでツールボックスから拾ってきてイベントを発行しプログラムを入力するまでを動画で見ていきましょう。

【Timerの設置】


★Timerを起動して時間を表示する
ビルドが完了したようなので起動してみましょう。
このようにして時計は動き出すようになるわけです。

【Timerを使用した時計の事例】


HOME > 絵を描く > Timerの設置