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 サイト (任意)
投稿モード
通常モード
図表モード (ソースコードを貼る場合はこちらを使用)
本文
(質問の場合は、開発環境・使用言語のバージョンなどを最初に書いてください)
■No102558 (魔界の仮面弁士 さん) に返信 > 2023/11/18(Sat) 11:04:44 編集(投稿者) > > # パラメーター指定をミスっていたので修正 > # そして 6 分差で被っちゃいました…(手順が違うけれど、ひとまとめに渡すという方針では同じ) > > ■No102556 (焼いも さん) に返信 >>Do While Not sr.EndOfStream >> Dim dt As String = sr.ReadLine '1行全てを読み取る >> Await Task.Run( > > 依頼者「No1 を処理してください」 > 作業者「了解…(長い処理)…終わりました」 > 依頼者「(ProgressBar を +1)」 > 依頼者「No2 を処理してください」 > 作業者「了解…(長い処理)…終わりました」 > 依頼者「(ProgressBar を +1)」 > > > これじゃ遅いですよ。 > 細切れにして何度も依頼しなおさないで、 > 全部まとめて、1 回だけ依頼しましょう。 > > > 依頼者「これらのデータを順に処理して、終わったものから随時報告してください」 > > > 進捗通知のための IProgress(Of T) を使ってみた例。 > > > Sub 画面表示更新処理(hoge As 任意の型) > 'ここは呼び出し元のスレッドで動くので、ProgressBar 等を操作しても構わない > '引数 hoge から進捗状況を受け取り、Label や ProgressBar 等に反映 > End Sub > > '今回の本題は IProgress > 'それ以外の引数は不要なら省いてもよいし、別の引数を追加してもよい > Function 時間のかかる処理本体部(argument As 処理させたいデータ, p As IProgress(Of 任意の型), cancelToken As CancellationToken) As Boolean > 'ここはワーカースレッドで動くので、画面操作は禁止 > For Each foo In argument > If cancelToken.IsCancellationRequested Then 'キャンセル依頼あり > Debug.WriteLine("キャンセル処理のための処理") > Return False '中断 > End If > > Debug.WriteLine("長い処理") > Thread.Sleep(1000) > > '引数 p を通じて進捗状況を記録 > p.Report( 進捗状況データ ) > > Next > Return True '全件処理完了 > End Function > > Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click > Button1.Enabled = False '多重呼び出しされないようにブロック > > '進捗報告のための IProgress(Of T) 実装を用意 > Dim p As New Progress(Of 任意の型)(AddressOf 画面表示更新処理) > > '中断依頼を受け付けるためのトークンを用意(今回は使ってない) > Me.cancelTokensource = New CancellationTokenSource() > Dim cToken = Me.cancelTokenSource.Token > > '時間のかかる処理 > Dim completed = Await Task.Run(Function() 時間のかかる処理本体部(作業依頼データ, p, cToken)) > If completed Then > Label1.Text = "完了" > Else > Label1.Text = "中断" > End If > > Button1.Enabled = True > End Sub > Private cancelTokenSource As CancellationTokenSource > Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click > '中断依頼 > cancelTokenSource?.Cancel() > End Sub > > > > なお、順次処理である必要が無い場合は Parallel.For や Parallel.ForEach などを使う手法もあります。 > (データを幾つかに分割し、複数の作業者に同時に依頼して並列処理させるイメージ)
編集キー
自分の投稿を編集する時に必要です
(半角8文字以内)
解決済み
/
解決したらチェックしておきましょう。
プレビュー/
管理者用
-
Child Tree
-