Sample02 残り時間を計算する


 残り時間を計算するサンプルです。

※サンプルは例外処理などを考慮しておりません。使用する場合は注意してください。なお、VB2010以外での動作確認しておりません。
※TextSS.net では例外を考慮し、さらに改良したソースコードを使っています。

'*******************************************************************************************
'** Sample02 残り時間を計算する By Yamashita-Y                                            **
'*******************************************************************************************
'** 注意事項                                                                              **
'**  1.初心者の方に分かりやすくするため、もっとも基本的に方法でコーディングしています。  **
'**  2.例外処理については考慮していません。                                              **
'**  3.使用した結果によるいかなる保障もいたしません。                                    **
'**  4.フォーム上に Button, ProgressBar, Label を配置してください。                      **
'*******************************************************************************************
'** 開発履歴                                                                              **
'**  2011.10.02 初版公開                                                                  **
'*******************************************************************************************

Imports System.Threading.Thread 'Sleep を使うにはこれが必要

Public Class Form1

    '前回表示させた時のシステム稼動時間を保持
    Dim intWaitOldPutTime As Integer = 0

    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click

        'ランダムの準備
        Dim rdnRandom As New System.Random()

        '開始時間を保持
        Dim intWaitTimeStart As Integer = System.Environment.TickCount And Integer.MaxValue

        '前回残り時間を表示させたときのシステム稼動時間
        intWaitOldPutTime = intWaitTimeStart

        '重たい処理のループ
        Dim intMaxLoop As Integer = 7000    'ループ回数
        ProgressBar1.Maximum = intMaxLoop   'プログレスバーの最大値をセット
        For i As Integer = 0 To intMaxLoop

            '重たい処理の変わりにランダムで待機させる
            Sleep(rdnRandom.Next(10)) '100未満のランダムミリ秒だけ待機

            '残り時間を画面に表示
            Call PutTime(i, intMaxLoop, intWaitTimeStart)

        Next

        'フォームを閉じる
        Me.Close()

    End Sub

    '残り時間を表示する関数
    Private Sub PutTime(ByRef intValue As Integer, _
                        ByRef intMax As Integer, _
                        ByRef intWaitTimeStart As Integer)

        'プログレスバーを更新
        Me.ProgressBar1.Value = intValue

        '進捗が0%(intValue=0)の時は抜ける
        If intValue = 0 Then
            Me.Label1.Text = "残り時間 計算中"
            Me.Label1.Refresh()
            Exit Sub
        End If

        '前回表示させてからシステム稼動時間が約3秒経過していなければ抜ける
        If intWaitOldPutTime + 3000 > (System.Environment.TickCount And Integer.MaxValue) Then
            Exit Sub
        End If

        '残り時間を表示させた時のシステム稼動時間を保持
        intWaitOldPutTime = System.Environment.TickCount And Integer.MaxValue

        '■計算1 開始から現在まで開始時間を計算
        ' システム稼動時間−処理を開始したときのシステム稼動時間
        Dim intWaitTime1 As Integer = _
            (System.Environment.TickCount And Integer.MaxValue) - intWaitTimeStart

        '■計算2 進捗数に対する経過時間を計算
        ' (ループ最大値×計算1)÷進捗数
        Dim intWaitTime2 As Integer = _
            (intMax * intWaitTime1) \ intValue

        '■計算3 残り時間の計算(秒単で計算)
        ' (計算2−計算1)÷1000
        Dim intWaitTime3 As Integer = _
            (intWaitTime2 - intWaitTime1) \ 1000

        '残り時間を時分秒の書式でセットする
        Dim strPutTime As String = Nothing
        If intWaitTime3 \ 3600 > 0 Then

            '残り時間が1時間(3600秒=60分×60秒)以上の場合
            ' 時 = (計算3÷3600秒)
            ' 分 = ((計算3÷3600秒)の余り÷60秒)
            ' 秒 = (((計算3÷3600秒)の余り÷60秒)の余り)
            strPutTime = String.Format("残り時間 約{0}時間{1}分{2}秒", _
                                       intWaitTime3 \ 3600, _
                                       (intWaitTime3 Mod 3600) \ 60, _
                                       (intWaitTime3 Mod 3600Mod 60)

        ElseIf (intWaitTime3 Mod 3600) \ 60 > 0 Then

            '残り時間が1分(60秒)以上の場合
            ' 分 = ((計算3÷3600秒)の余り÷60秒)
            ' 秒 = (((計算3÷3600秒)の余り÷60秒)の余り)
            strPutTime = String.Format("残り時間 約{0}分{1}秒", _
                                       (intWaitTime3 Mod 3600) \ 60, _
                                       (intWaitTime3 Mod 3600Mod 60)

        Else

            '残り時間が1分(60秒)未満の場合
            ' 秒 = (((計算3÷3600秒)の余り÷60秒)の余り)
            strPutTime = String.Format("残り時間 約{0}秒", _
                                       (intWaitTime3 Mod 3600Mod 60)

        End If

        '画面に残り時間を表示
        Me.Label1.Text = strPutTime
        Me.Label1.Refresh()

    End Sub

End Class
■出力結果■  コンソール出力はありません。画面上で確認してください。

■ダウンロード■
 Sample02.zip (156Kb)