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 サイト (任意)
投稿モード
通常モード
図表モード (ソースコードを貼る場合はこちらを使用)
本文
(質問の場合は、開発環境・使用言語のバージョンなどを最初に書いてください)
■No102557 (とっちゃん さん) に返信 > ■No102556 (焼いも さん) に返信 >>102521に関連しての追加質問で恐縮です。 >> >>上が従来ので、下が教えていただいたのを参考にし作ったものです。 >>どちらも正常に働き結果も同じなのですが、何故か下にした場合には所要時間がとてつもなく掛かってしまうのです。 >>サンプルではシンプルに作ってますが、実際のは結構複雑な計算もしていて、またその結果データの書き込みもしてもいます。 >>何故これほどの時間差が出るのか、ご教授のほどお願い致します。 >> > 実際に試したわけでもありませんが、どのくらいの時間差があるのかなどがわかりません。 > 非同期化しているので、このサンプルのコードの場合であれば > 時間がかかるのは、別スレッドで処理している結果、メッセージが処理される分もあると思いますが > 毎回 Task をつくって Await するため、作成時間と終了時間と、同期化するための時間、 > それと、メッセージ処理がきちんとなされるため(プログレスバーが動いてラベルが変わりますよね?)に > かかる時間とがあるためです。 > > 2000回行っているので、仮に1回あたりの平均が 0.01 秒だったとしても20秒変わってきます。 > > さて、ではどうするか?というと、Run()をこまめに起こすのではなく、 > 丸っとひとまとめにして別スレッドで処理する(前回出ていたパターンがこれに該当)か > Dataflowなどを利用してデータ並列(タスク並列)にしていくかのいずれかになります。 > > 処理の具体的な内容がわからないのでどちらが良いかなどは言えませんが一応改めて > 今回のサンプルコードをきれいにスレッドアウトしたパターンを提示しておきます。 > > 参考程度にこれだとどの程度変わるか試してみてください。 > > > Private Async Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click > ' 前処理(ProgressBar1, Label1 は自分の所有物なのでほかの人は触れないと思えばいい) > ProgressBar1.Minimum = 0 : ProgressBar1.Maximum = 2000 : ProgressBar1.Value = 0 > Label1.Text = "0" > ' Run の中身は丸っと別スレッドで実行される(自分ではない人にお願いしていると思えばよい) > Await Task.Run( > Sub() > Using sr As New System.IO.StreamReader("C:\Users\***\***.csv", System.Text.Encoding.GetEncoding("Shift_JIS")) > Dim dats As Integer = 0 '処理済み数 > Do While Not sr.EndOfStream > Dim dt As String = sr.ReadLine '1行全てを読み取る > > 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 > ' sr は Using しているので Close を呼ばなくても問題ない > End Using > End Sub) > End Sub >
編集キー
自分の投稿を編集する時に必要です
(半角8文字以内)
解決済み
/
解決したらチェックしておきましょう。
プレビュー/
管理者用
-
Child Tree
-