土曜の朝,ゆっくり寝ていたら,ダダダーと轟音が響き,家が気持ち悪いくらい揺れた。有事か?
実は先日から,隣の家が解体中なのだ。平日は遅々として進まなかったのが,土曜日に一気に解体が始まったのだ。壊しているのはこの町ができたときに建った家だ。私が,就職したころには,まだ家を建てた人が住んでいた。たしか,お父さんは国鉄に勤めておられたはずだ。決してJRではなく,日本国有鉄道だ。そのご家族が引っ越していかれたあと,借家として機能していたこともあったが,ここ数年は町内にある家の息子さん夫婦が買い取って何年か住んでおられた。更地にして販売することになったと数日前に建築屋さんが挨拶にきた。40年近くそこにあったものがなくなるのは感慨深いが,木造平屋住宅が跡形もなくなるには1日も要しない。
町ができたときは,未舗装の道路をボンネットバスが走っていたのだが,あと10年もしないうちに近くを北陸新幹線が通ることになる。町は変わり,子供は成長するが自分だけはなにも進歩がないようだ。
12月10日 高三の長男こうしろうは学校で模試,中三の次男かずは富山全県統計会模試を受けに行った。こうしろうのモットーは「節約」なので,決して塾などに行かず,通信教育も受けず,もちろん家庭教師などに来てもらうことなく,学校だけを頼りに勉強してきた。「公立の高校,大学に進むには学校の勉強重視でよい」という方針が我が家に出来上がったが,自分のポジションがどのあたりかを知るために,本番の練習も兼ねて,12月になるとかずも模試を受けることにした。時間に追われてあせることのないように,時間配分のコツというか時間中にテストをこなす経験も必要だろう。
と,ここまでかけて時間を測るタイマーコントールに話しを持ってきたわけである。時間を測るという処理は,多くのアプリケーションで必要である。何かをするのにかかる時間を測るだけでなく,一定時間,ユーザーがパソコンの操作をしなかったらどうするとか,指定した時間を経過するとデータをハードディスクに保存するとかタイマーの出番は実は多いのだ。
この日,こうしろうはまずフォームを作りタイマーコントロールを貼り付けた。簡単なデジタル時計を作るのだ。
ラベルがフォーム全体に広がっているのは,DockプロパティがFillになっているからだ。コンポーネント・トレイにはタイマーが配置してある。このタイマーはSystem.Windows.Forms名前空間のtimerクラスである。わざわざこう断るのは,他にもタイマーがあるからだ。
System.Windows.Forms.Timer クラスのほかに,System.Threading.Timerクラス(スレッド・タイマ)とSystem.Timers.Timerクラス(サーバベース・タイマ)がある。一番簡単に使えるのは今回使うSystem.Windows.Forms.Timerだ。
---------------------------------------------------------- namespace Clock { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //タイマの間隔を200msに設定 timer1.Interval = 200; //タイマを有効化 timer1.Enabled = true; } private void timer1_Tick(object sender, EventArgs e) { //現在の時刻を取得 DateTime dt = DateTime.Now; //時刻をラベルに表示 label1.Text = dt.ToLongTimeString(); } } } ----------------------------------------------------------
タイマーのインターバル(Interval)に設定している数値はミリ秒だ。ここでは200を指定しているので,0.2秒の間隔でTickイベントが発生する。
timer1_Tickイベントの処理内容は現在の日時を取得して,時刻をラベルに表示することだ。
デジタル時計が出来上がった。ここまではこうしろうも肩慣らしなのだが,どうも進みが遅い。あちこちにセロテープで補修された高校入学時に祖母に買ってもらったサブノートPCが不安定で,デザインモードだと動きが悪いようなので早仕舞いにした。
翌日,筆者はこのタイマーがどこまで正確なのか調べてみた。というのはWin9x,VB5,6の時代のタイマーコントロールはあまり正確でないと言われていたからだ。
Visual Studioツールから,Spy++を起動し,メッセージのログ出力を選び,ファインダツールで作成した時計プログラムを指し,WM_TIMERメッセージだけを表示させる。
上から順にログを見ていただくと,200ミリ秒間隔でメッセージが出力されていることがおわかりいただけると思う。かつ,1000分の1ミリ秒単位で少しずつ遅れていっていることもおわかりいただけると思う。
注目してほしいのは反転している行だ。ポンと時間が飛んでいる。WM_TIMERメッセージは優先度が低いので,他のメッセージを処理しなくていけないときは処理できないことがある。もっと正確な計測が必要な場合は,他のクラスを使ったほうがよいかもしれない。
さて,実は筆者,ITproにVisual Basic2005の連載も書いています。Visual C#2005とVisual Basic2005は同じ.NET Framework2.0を利用しますので,できることに大きな違いはありません。C#でないと匿名メソッドが利用できなかったり,VBだとMyが使えるといった違いはありますが,コンポーネントは同じものが使えるので,どちらかの経験がもう一方の学習の邪魔になるということはありません。VBでも C#でもお好きなほうで,無償で使えるExpress Editionからプログラミングを始めてみませんか?