C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 時間のかかる処理の進行状況の表示について


(過去ログ 178 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■102260 / inTopicNo.1)  時間のかかる処理の進行状況の表示について
  
□投稿者/ ゆい (24回)-(2023/08/09(Wed) 12:59:59)

分類:[VB.NET/VB2005 以降] 

いつも初歩的なことばかりですみません。
下のはhttps://dobon.net/vb/dotnet/programing/displayprogress.htmlにあったのを見させていただいたものです。
この中の
 > '1秒間待機する(時間のかかる処理があるものとする)
 >  System.Threading.Thread.Sleep(1000)
を、、
System.Threading.Thread.Sleep(1000)
System.Threading.Thread.Sleep(1000)
System.Threading.Thread.Sleep(1000)
のように3回繰り返し、1回終る毎に進行状況表示が3分の1づつ増え、3回目で終わるにはどのようにすれば良いのか教えてください。
ここではFor i = 1 To maxLoopsで進行状況表示がされています。
よろしくお願いします。
    -----------------------------------------------------------
    'Button1のClickイベントハンドラ
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        '処理が行われているときは、何もしない
        If BackgroundWorker1.IsBusy Then
            Return
        End If

        'Button1を無効にする
        Button1.Enabled = False

        'コントロールを初期化する
        ProgressBar1.Minimum = 0
        ProgressBar1.Maximum = 10
        ProgressBar1.Value = 0
        Label1.Text = "0"

        'BackgroundWorkerのProgressChangedイベントが発生するようにする
        BackgroundWorker1.WorkerReportsProgress = True
        'DoWorkで取得できるパラメータ(10)を指定して、処理を開始する
        'パラメータが必要なければ省略できる
        BackgroundWorker1.RunWorkerAsync(10)
    End Sub

    'BackgroundWorker1のDoWorkイベントハンドラ
    'ここで時間のかかる処理を行う
    Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim bgWorker As BackgroundWorker = DirectCast(sender, BackgroundWorker)

        'パラメータを取得する
        Dim maxLoops As Integer = CInt(e.Argument)

        '時間のかかる処理を開始する
        Dim i As Integer
        For i = 1 To maxLoops
            '1秒間待機する(時間のかかる処理があるものとする)
            System.Threading.Thread.Sleep(1000)

            'ProgressChangedイベントハンドラを呼び出し、
            'コントロールの表示を変更する
            bgWorker.ReportProgress(i)
        Next

        'ProgressChangedで取得できる結果を設定する
        '結果が必要なければ省略できる
        e.Result = maxLoops
    End Sub

    'BackgroundWorker1のProgressChangedイベントハンドラ
    'コントロールの操作は必ずここで行い、DoWorkでは絶対にしない
    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        'ProgressBar1の値を変更する
        ProgressBar1.Value = e.ProgressPercentage
        'Label1のテキストを変更する
        Label1.Text = e.ProgressPercentage.ToString()
    End Sub

    'BackgroundWorker1のRunWorkerCompletedイベントハンドラ
    '処理が終わったときに呼び出される
    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        If Not e.Error Is Nothing Then
            'エラーが発生したとき
            Label1.Text = "エラー:" & e.Error.Message
        Else
            '正常に終了したとき
            '結果を取得する
            Dim result As Integer = CInt(e.Result)
            Label1.Text = result.ToString() & "回で完了しました。"
        End If

        'Button1を有効に戻す
        Button1.Enabled = True
    End Sub

引用返信 編集キー/
■102261 / inTopicNo.2)  Re[1]: 時間のかかる処理の進行状況の表示について
□投稿者/ WebSurfer (2765回)-(2023/08/09(Wed) 14:23:09)
No102260 (ゆい さん) に返信

以下は質問に対する直接的な答えではないです。

> 下のはhttps://dobon.net/vb/dotnet/programing/displayprogress.htmlにあったのを
> 見させていただいたものです。

何か事情があるのでなければ、BackgroundWorker を使っているような古い記事を参考に
するのではなく、.NET 4.5 から使えるようになった async / await を使って考えては
いかがですか? 例えば以下の記事は参考になりませんか?

WPF/Windowsフォーム:時間のかかる処理をバックグラウンドで実行するには?(async/await編)
https://atmarkit.itmedia.co.jp/ait/articles/1512/02/news019.html


ちなみに、BackgroundWorker は以下の記事の「Figure 3: .NET Frameworkにおける非同
期処理システムの歩み」の Event-based の時代のものです。

第1回 .NET開発における非同期処理の基礎と歴史
https://atmarkit.itmedia.co.jp/fdotnet/chushin/masterasync_01/masterasync_01_02.html

引用返信 編集キー/
■102263 / inTopicNo.3)  Re[2]: 時間のかかる処理の進行状況の表示について
□投稿者/ ゆい (25回)-(2023/08/09(Wed) 17:56:36)
No102261 (WebSurfer さん) に返信

> 以下は質問に対する直接的な答えではないです。
とのことですが、、DisableAllButtons()とEableAllButtons()は、
「宣言されていません。アクセスできない保護レベルになっています。」が出ましたので削除はしましたが正常に動きました。
おっしゃるように、短文でもありますのでこちらの方が良さそうです。

 ----------------------------------------------------
    Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        'DisableAllButtons()   '<--- 宣言されていません。アクセスできない保護レベルになっています。

        Label1.Text = "処理中…"  ' ToolStripStatusLabel1.Text = "処理中…"
        ProgressBar1.Value = 0    'ToolStripProgressBar1.Value = 0

        ' Progressクラスのインスタンスを生成
        Dim p = New Progress(Of Integer)(AddressOf ShowProgress)

        ' 時間のかかる処理を別スレッドで開始
        Dim result As String = Await Task.Run(Function() DoWork(p, 100))

        ' 処理結果の表示
        Label1.Text = result     '  ToolStripStatusLabel1.Text = result
        ProgressBar1.Value = 100 '  ToolStripProgressBar1.Value = 100
        MessageBox.Show("正常に完了")

        'EableAllButtons()   '<--- 宣言されていません。アクセスできない保護レベルになっています。
    End Sub

    ' 進捗を表示するメソッド(これはUIスレッドで呼び出される)
    Private Sub ShowProgress(percent As Integer)
        Label1.Text = percent & "%完了"
        ProgressBar1.Value = percent
    End Sub

    ' 時間のかかる処理を行うメソッド(進捗付き)
    Private Function DoWork(progress As IProgress(Of Integer), n As Integer) As String
        ' 別スレッドで実行されるため、このメソッドでは
        ' UI(コントロール)を操作してはいけない

        ' 時間のかかる処理
        For i As Integer = 0 To n - 1
            System.Threading.Thread.Sleep(100)

            Dim percentage As Integer = i * 100 \ n ' 進捗率
            progress.Report(percentage)
        Next

        ' このメソッドからの戻り値
        Return "全て完了"
    End Function

引用返信 編集キー/
■102264 / inTopicNo.4)  Re[3]: 時間のかかる処理の進行状況の表示について
□投稿者/ WebSurfer (2766回)-(2023/08/09(Wed) 23:14:01)
No102263 (ゆい さん) に返信

> 「宣言されていません。アクセスできない保護レベルになっています。」が出ましたので削除はしましたが正常に動きました。
> おっしゃるように、短文でもありますのでこちらの方が良さそうです。

結局、私が紹介した記事を参考にやりたいことはできたのですか? であれば、「解決済み」マーク
をつけてこのスレッドはクローズしてください。
引用返信 編集キー/
■102266 / inTopicNo.5)  Re[4]: 時間のかかる処理の進行状況の表示について
□投稿者/ ゆい (26回)-(2023/08/10(Thu) 00:27:14)
No102264 (WebSurfer さん) に返信

> 結局、私が紹介した記事を参考にやりたいことはできたのですか? であれば、「解決済み」マーク
> をつけてこのスレッドはクローズしてください。

すみません。
まだそこまでは出来てません。

引用返信 編集キー/
■102268 / inTopicNo.6)  Re[5]: 時間のかかる処理の進行状況の表示について
□投稿者/ WebSurfer (2767回)-(2023/08/10(Thu) 08:53:57)
No102266 (ゆい さん) に返信

> 正常に動きました。

と書いてあったのだけど、違うのですか?
引用返信 編集キー/
■102269 / inTopicNo.7)  Re[6]: 時間のかかる処理の進行状況の表示について
□投稿者/ ゆい (27回)-(2023/08/10(Thu) 14:36:26)
No102268 (WebSurfer さん) に返信

>>正常に動きました。
>
> と書いてあったのだけど、違うのですか?

正常に動いのはその時に付けたのですが、でも後はこちらで考えることにします。
ありがとうございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -