For文を使うプログラムでプログレスバーを使用する方法 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/3/29 00:18:22
> For文を使うプログラムの進捗状況をプログレスバーに表示することはできますか?
For のループはごく短い時間で完了しますので、通常はプログレスバーに表示しきれません。

一回のループあたりの処理時間が長い場合にはその限りではありませんが、
処理が長いと、画面の再描画処理も阻害されてしまう可能性が高いため、
プログレスバーを併用しても、あまり有効では無いと思います。

> プログレスバーを進めるにはFor文を使いますよね?
もちろん、For を使う場合もあろうかと思いますけれども、個人的には、
プログレスバーを For と組み合わせて使う頻度は、さほど高くないですね。

使うのであれば、Timer や BackgroundWorker、あるいは非同期系の処理と組み合わせて、
「長い処理」を行う部分と、その進捗状況をプログレスバーに表示する部分とを
分離したほうが良いかと思います。
投稿者 るきお  (社会人) 投稿日時 2011/3/28 23:06:16
う~ん。よくわかりません。

Forの中にFor Each分を入れることは普通にできます。
プログレスバーの制御はForだろうとFor Eachだろうと私が書いたように書くだけです。
何か困っていることがあるのでしょうか?

具体的なプログラムを載せて、「ここでこうしたいが、できない。または、エラーになる。」みたいに書いてもらえればもうちょっとアドバイスできるかもしれません。
投稿者 AFO  (中学生) 投稿日時 2011/3/28 22:32:51
間違えました。
ForのなかにFor Each文です
投稿者 るきお  (社会人) 投稿日時 2011/3/28 22:20:31
言おうとされていることがよくわかりません。

>For文を使うプログラムの進捗状況をプログレスバーに表示することはできますか?
>プログレスバーを進めるにはFor文を使いますよね?
1つのForがこの両方の役割を兼ねるように書くのが普通と思います。

   
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
    For i As Integer = 0 To 99

        '時間のかかる処理。ここではSleepにしておきます。 
        Threading.Thread.Sleep(100)

        ProgressBar1.Value += 1
    Next
End Sub


もうちょっと複雑な場合を想定していますか?
投稿者 AFO  (中学生) 投稿日時 2011/3/28 22:03:32
For文を使うプログラムの進捗状況をプログレスバーに表示することはできますか?

プログレスバーを進めるにはFor文を使いますよね?

ということは

For開始

Forの中にあるFor(For2とし、時間のかかる作業)を実行(この時点でプログレスバーは変化なし)

For2終了

プログレスバーのvalueプロパティを1プラスする

Next

またFor2を実行




となってしまいます。
どうすればいいでしょうか