'******************************************************************************************* '** 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 3600) Mod 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 3600) Mod 60) Else '残り時間が1分(60秒)未満の場合 ' 秒 = (((計算3÷3600秒)の余り÷60秒)の余り) strPutTime = String.Format("残り時間 約{0}秒", _ (intWaitTime3 Mod 3600) Mod 60) End If '画面に残り時間を表示 Me.Label1.Text = strPutTime Me.Label1.Refresh() End Sub End Class |
■出力結果■ コンソール出力はありません。画面上で確認してください。 |
■ダウンロード■ Sample02.zip (156Kb) |