|
.NET TIPS タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)デジタルアドバンテージ 遠藤 孝信2005/11/11 |
![]() |
|
|
|
.NET Frameworkには一定時間間隔で処理を行う(メソッドを呼び出す)ためのタイマ機能として、以下の3種類のTimerクラスが用意されている。
Windowsタイマ:System.Windows.Forms.Timerクラス
スレッド・タイマ:System.Threading.Timeクラス (解説TIPSへ)
サーバベース・タイマ:System.Timers.Timerクラス (解説TIPSへ)
本稿では
のWindowsタイマについて、その基本的な使い方をまとめる。
Windowsタイマ:System.Windows.Forms.Timerクラス
Windowsアプリケーション(Windowsフォーム・アプリケーション)でタイマを利用したい場合には、通常System.Windows.Forms名前空間のTimerクラスを利用する。
このタイマはWindows OSのタイマ・メッセージ(WM_TIMERメッセージ)をベースにしており、タイマを利用するにはメッセージ・ループの実行が必要である(一般的なWindowsフォーム・アプリケーションはApplication.Runメソッドの呼び出しを含んでおり、このメソッドによりメッセージ・ループが実行される)。
このTimerクラスでは、EventHandlerデリゲート(System名前空間)を使用して、タイマにより呼び出されるメソッド(以下、タイマ・メソッドと記す)のデリゲートを作成し、TimerクラスのTickイベントに登録する(VB.NETではWithEvents /Handles キーワードによりイベントを登録することも可能)。
タイマ・メソッドの呼び出し間隔はIntervalプロパティにより設定し(単位はミリ秒)、タイマの開始/停止は、Enabledプロパティにtrue/falseを設定して行う(あるいはStart/Stopメソッドを呼び出してもよい)。
以下にWindowsタイマを使用したサンプル・プログラムを示す。このプログラムではTimerクラスに関する記述を分かりやすくするために、コンソール・アプリケーションとして記述している。MyClockメソッドがタイマにより一定間隔で実行されるメソッドである。
|
|
| Windowsタイマを使用したC#のサンプル・プログラム(formstimer.cs) | |
|
|
| Windowsタイマを使用したVB.NETのサンプル・プログラム(formstimer.vb) | |
Visual Studioでプログラミングしている場合には、ツールボックスの[Windowsフォーム]タブから「Timerコンポーネント」をフォームにドラッグ&ドロップするだけでタイマが利用可能な状態となる。配置したTimerコンポーネントをダブルクリックすれば、タイマ・メソッド(Tickイベント・ハンドラ)が自動的に作成される。
Windowsタイマを利用するときの注意点
なお冒頭で述べたように、このタイマはWindows OSのメッセージをベースとしているため、タイマ・メッセージが発生したときにほかのメッセージの処理を行っているとタイマ・メソッドは呼び出されない。また、その間に発生した複数のタイマ・メッセージは1つにまとめられる。
例えば、呼び出し間隔を1秒に設定したタイマを開始し、ボタンがクリックされたときの処理を3秒間にわたって行ったとすると、タイマ・メソッドが呼び出されるのはボタンのクリック処理が終わった直後となる。
このため、Windowsアプリケーションで定期的な処理を確実に実行したい場合には、マルチスレッドにより動作する(前述の)ほかの2つのタイマの利用を検討する必要がある。
.NET Framework 1.1におけるWindowsタイマのバグ情報
System.Windows.Forms.Timerクラスについては現在、以下のバグがMicrosoftより報告されている。
- FIX: A Windows Forms-based application that uses the System.Windows.Forms.Timer control may stop responding when the Enabled property of the Timer control is set to false in the .NET Framework 1.1(FIX: System.Windows.Forms.Timer コントロールを使用する Windows フォーム ベースのアプリケーションは、 Timer コントロールの Enabled プロパティが .NET Framework 1.1 の false に設定される場合、応答を停止することがあります。)
これは.NET Framework 1.1 SP1(Service Pack 1)を適用した環境において、System.Windows.Forms.TimerクラスのEnabledプロパティをfalseに設定した場合に、Windowsフォーム・アプリケーションがフリーズしてしまうことがあるというバグだ。
System.Windows.Forms.Timerクラスを使っていてWindowsアプリケーションが不意に停止するような不可解な挙動が起こる場合には、このバグ情報をチェックしていただきたい。
なおこの問題を修正するHotFixは、(2005年11月10日時点で)マイクロソフト・サポート契約センターに問い合わせることで入手できる。ただしこれはあくまで臨時的な解決策なので、もしこの問題に直面していない場合は正式なService Packのリリースを待った方がよい。![]()
| カテゴリ:Windowsフォーム 処理対象:Timerコンポーネント 使用ライブラリ:Timerコンポーネント(System.Windows.Forms名前空間) 使用ライブラリ:EventHandlerデリゲート(System名前空間) 関連TIPS:タイマにより一定時間間隔で処理を行うには?(スレッド・タイマ編) 関連TIPS:タイマにより一定時間間隔で処理を行うには?(サーバベース・タイマ編) |
|
||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


