ストップウォッチによる経過時間の取得方法について
サンプル コードのダウンロード (vbmigtips_Stopwatch.msi, 494 KB)
※ このサンプルをインストールするには Visual Studio 2005 が必要です。
Visual Basic 2005 では、.NET Framework2.0 の追加により、Stopwatch クラスが新たにサポートされました。Stopwatch クラスを使用することで、経過時間を正確に計測できるようになりました。そこで今回は、経過時間を計るストップウォッチ操作について紹介します。
Visual Basic 6.0 でストップウォッチ操作を実装する場合、Win32API 関数の timeGetTime を使用します。今回、1秒ごとに経過時間の合計を表示するため、Timer コントロール(Interval プロパティを「1000」に設定します。)を使用します。実装コードは以下のとおりです。
Private Declare Function timeGetTime Lib "winmm.dll" () As Long Dim startTime As Long Dim endTime As Long Private Sub Command1_Click() Timer1.Enabled = True startTime = timeGetTime End Sub Private Sub Command2_Click() Timer1.Enabled = False endTime = timeGetTime Label1.Caption = (endTime - startTime) / 1000 End Sub Private Sub Timer1_Timer() Label1.Caption = (timeGetTime - startTime) / 1000 End Sub
リスト1
上記(リスト1)の「Private Declare Function timeGetTime Lib "winmm.dll" () As Long」で経過時間を計測する timeGetTime 関数の定義を宣言します。「startTime = timeGetTime」で、計測開始時の経過時間を取得し、「endTime = timeGetTime」で計測終了時の経過時間を取得します。そして、「Label1.Caption = (endTime - startTime) / 1000」で計測開始時から終了時の時間を計測し表示します。
「Private Sub Timer1_Timer() ... End Sub」では、1秒ごとに経過時間の合計を表示するため、Timer イベントハンドラを指定します。「Timer1.Enabled = True」でタイマをスタートし、「Timer1.Enabled = False」でタイマをストップします。「Label1.Caption = (timeGetTime - startTime) / 1000」では、Timer イベント発生時、計測開始時から現在までの経過時間を計測し表示します(図1)。
図1
一方、Visual Basic 2005 では、新たに System.Diagnostics.Stopwatch クラスがサポートされたことにより、より簡単に実装できるようになりました。そこで続いては、Visual Basic 2005 の Stopwatch クラスを使用して、図1 のアプリケーションを作成します。実装コードは以下のとおりです。
Private stopWatch As Stopwatch Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True stopWatch = New Stopwatch() stopWatch.Start() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click stopWatch.Stop() TextBox1.Text = stopWatch.ElapsedMilliseconds.ToString("N") End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If stopWatch.IsRunning = True Then TextBox1.Text = stopWatch.ElapsedMilliseconds.ToString("N") End If End Sub
リスト2
上記(リスト2)の「stopWatch.Start()」で経過時間の計測を開始し、「stopWatch.Stop()」で経過時間の計測を終了します。「TextBox1.Text = stopWatch.ElapsedMilliseconds.ToString("N")」で計測された経過時間の合計をミリ秒単位で取得し、表示します。さらに、「Private Sub Timer1_Tick(ByVal sender ... End If」では、1秒ごとに経過時間の合計を表示します。上記を実装し、「スタート」ボタンをクリックすると図1 のようにストップウォッチ操作を行うことができます。
上記では、経過時間の合計をミリ秒単位で表示する方法を紹介しましたが、Stopwatch クラスでは、経過時間の合計を「00:00:00.000000」形式で取得したり、タイマ刻みで取得したりすることもできます。経過時間の合計を「00:00:00.000000」形式で表示させたい場合は、「TextBox1.Text = stopWatch.Elapsed.ToString」とし、タイマ刻みで表示する場合は「TextBox1.Text = stopWatch.ElapsedTicks.ToString("N")」とします。図2 は、「TextBox1.Text = stopWatch.Elapsed.ToString」と設定した場合の実装結果です。
図2
さらに、 Stopwatch クラスでは、タイマ間隔の計測を中止し、経過時間をゼロにリセットする Reset メソッドや、経過時間をゼロにし、計測を開始する StartNew メソッドなどもサポートされています。