C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
C# と VB.NET の入門サイト
(追質)時間のかかる処理の進行の表示 [1]
掲示板トップ
C# と VB.NET 入門
新規作成
利用方法/規約
ツリー表示
トピック表示
ランキング
記事検索
過去ログ
[トピック内 23 記事 (21 - 23 表示)]
<<
0
|
1
>>
■102587
/ inTopicNo.21)
Re[7]: (追質)時間のかかる処理の進行の表示
▼
■
□投稿者/ 焼いも
(20回)-(2023/11/21(Tue) 00:53:46)
■
No102586
(とっちゃん さん) に返信
> 趣味として楽しむ範疇は人それぞれなので、ハードルが高いなら超えなくてもいいと思います。
ご理解ありがとうございます。
このような者にも、こうして教えてもいただくこと本当に有り難いことです。
> 強制再描画ではなく、たまったイベントを処理することでアプリケーションが応答なしに
> ならない状態になります。
その通りでそれで十分であり、それを願っての質問でもあります。
> 以下のように変更してみてください(Me.Refreshはあえてコメントで残してある)
>
> ProgressBar1.Value = dats
> ' Me.Refresh()
> Label1.Text = dats.ToString()
> Application.DoEvents()
Label1.Text = dats.ToString() は、この分の時間が掛かるため削除はしましたが、
実際のプログラムに当て嵌め実行もしてみても、処理時間を含め何等の問題もなくただただ感謝です。
これで一挙に解決です。
ありがとうございました。
解決済み
引用返信
編集キー/
編集
■102588
/ inTopicNo.22)
Re[12]: (追質)時間のかかる処理の進行の表示
▲
▼
■
□投稿者/ 焼いも
(21回)-(2023/11/21(Tue) 00:59:57)
■
No102585
(WebSurfer さん) に返信
度々のお手数もお掛けしてしまいましたが、No102586、No102587のようなことです。
ご了承のほどお願い申し上げます。
引用返信
編集キー/
編集
■102589
/ inTopicNo.23)
Re[8]: (追質)時間のかかる処理の進行の表示
▲
▼
■
□投稿者/ WebSurfer
(2809回)-(2023/11/21(Tue) 18:07:00)
解決済みマーク
解決済み
引用返信
編集キー/
編集
このトピックをツリーで一括表示
<前の20件
トピック内ページ移動 /
<<
0
|
1
>>
このトピックに書きこむ
入力内容にタグは利用できません。
他人を中傷する記事は管理者の判断で予告無く削除されます。
半角カナは使用しないでください。文字化けの原因になります。
名前、コメントは必須記入項目です。記入漏れはエラーになります。
入力内容の一部は、次回投稿時の手間を省くためブラウザに記録されます。
URL は自動的にリンクされます。
記事中に No*** のように書くとその記事にリンクされます(No は半角英字/*** は半角数字)。
名前
(*必須)
E-Mail (任意)
Web サイト (任意)
投稿モード
通常モード
図表モード (ソースコードを貼る場合はこちらを使用)
本文
(質問の場合は、開発環境・使用言語のバージョンなどを最初に書いてください)
■No102562 (WebSurfer さん) に返信 > ■No102557 (とっちゃん さん) に返信 > >>非同期化しているので、このサンプルのコードの場合であれば >>時間がかかるのは、別スレッドで処理している結果、メッセージが処理される分もあると思いますが >>毎回 Task をつくって Await するため、作成時間と終了時間と、同期化するための時間、 >>それと、メッセージ処理がきちんとなされるため(プログレスバーが動いてラベルが変わりますよね?)に >>かかる時間とがあるためです。 > > 自分もそうだろうなぁと思ったのですが、念のため試してみるとほとんど差はないという > 結果になりました。 > > 検証に使ったのは以下のコードです。元のコードにあった CSV ファイルを読むという余計 > な操作は削除しましたが、それ以外は質問 No102556 と、とっちゃんさんのレス No102557 > とほぼ同じで、それに時間を測るための StopWtach を追加しています。 > > 最後の、Button4_Click のコードは、私が先のスレッドで書いたレス No102531 に書いた > ように、2000 個 Task.Run でキューに配置して、全部の終了を await Task.WhenAll(...) > で待機するものです。 > > 結果は: > > Button1: 3' 40" > Button2: 3' 36" > Button3: 3' 36" > Button4: 0' 18" (2 回目以降は 8" 前後) > > となりました。Button1 が遅いのは Me.Refresh() のせいです。 > > ひょっとしたら何か自分の勘違い・間違いとかがあるかもしれませんので、閲覧者の方に > 確認していただけると幸いです。 > > 自分の環境は Windows 10 Pro 22H2, VS2022 v17.8.0, .NET Framework 4.8 です。 > > Public Class Form5 > Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click > Dim dats As Integer = 0 '処理済み数 > ProgressBar1.Minimum = 0 : ProgressBar1.Maximum = 2000 : ProgressBar1.Value = 0 > Label1.Text = "0" > Label2.Text = "" > > Dim stopWatch As New Stopwatch() > stopWatch.Start() > > Do While True > System.Threading.Thread.Sleep(100) 'ここに全ての計算や結果データの書き込みもあります。 > > '処理済み数(ProgressBar1値の更新) > dats = dats + 1 > ProgressBar1.Value = dats > Me.Refresh() > Label1.Text = dats.ToString() > 'Application.DoEvents() > > If dats = 2000 Then '一応ここで脱出 > Exit Do > End If > Loop > > stopWatch.Stop() > Dim ts As TimeSpan = stopWatch.Elapsed > Dim elapsedTime As String = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", > ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10) > Label2.Text = elapsedTime > End Sub > > Private Async Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click > Dim dats As Integer = 0 '処理済み数 > ProgressBar1.Minimum = 0 : ProgressBar1.Maximum = 2000 : ProgressBar1.Value = 0 > Label1.Text = "0" > Label2.Text = "" > > Dim stopWatch As New Stopwatch() > stopWatch.Start() > > Do While True > Await Task.Run( > Sub() > System.Threading.Thread.Sleep(100) 'ここに全ての計算や結果データの書き込みもあります。 > End Sub) > '処理済み数(ProgressBar1値の更新) > dats = dats + 1 > ProgressBar1.Value = dats > Label1.Text = dats.ToString() > > If dats = 2000 Then '一応ここで脱出 > Exit Do > End If > Loop > > stopWatch.Stop() > Dim ts As TimeSpan = stopWatch.Elapsed > Dim elapsedTime As String = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", > ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10) > Label2.Text = elapsedTime > End Sub > > Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click > ProgressBar1.Minimum = 0 : ProgressBar1.Maximum = 2000 : ProgressBar1.Value = 0 > Label1.Text = "0" > Label2.Text = "" > > Dim stopWatch As New Stopwatch() > stopWatch.Start() > > Await Task.Run( > Sub() > Dim dats As Integer = 0 > Do While True > System.Threading.Thread.Sleep(100) 'ここに全ての計算や結果データの書き込みもあります。 > > dats = dats + 1 > Invoke( > Sub() > ' 別のスレッドからは自分の所有物にアクセスできないので自分 > ' でやるために Invoke(自分の処理として呼び出し)してもらう > ProgressBar1.Value = dats > Label1.Text = dats.ToString() > End Sub) > If dats = 2000 Then '一応ここで脱出 > Exit Do > End If > Loop > End Sub) > > Stopwatch.Stop() > Dim ts As TimeSpan = Stopwatch.Elapsed > Dim elapsedTime As String = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", > ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10) > Label2.Text = elapsedTime > End Sub > > Private Async Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click > Dim dats As Integer = 0 '処理済み数 > Label1.Text = "" > Label2.Text = "" > > Dim stopWatch As New Stopwatch() > stopWatch.Start() > > Dim taskList = New List(Of Task)() > Do While True > taskList.Add(Task.Run( > Sub() > System.Threading.Thread.Sleep(100) 'ここに全ての計算や結果データの書き込みもあります。 > End Sub)) > > dats = dats + 1 > If dats = 2000 Then '一応ここで脱出 > Exit Do > End If > Loop > > Await Task.WhenAll(taskList) > > stopWatch.Stop() > Dim ts As TimeSpan = stopWatch.Elapsed > Dim elapsedTime As String = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", > ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10) > Label2.Text = elapsedTime > End Sub > End Class >
編集キー
自分の投稿を編集する時に必要です
(半角8文字以内)
解決済み
/
解決したらチェックしておきましょう。
プレビュー/
管理者用
-
Child Tree
-