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

タグの編集
投稿者 AFO  (中学生) 投稿日時 2011/3/28 22:03:32
For文を使うプログラムの進捗状況をプログレスバーに表示することはできますか?

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

ということは

For開始

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

For2終了

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

Next

またFor2を実行




となってしまいます。
どうすればいいでしょうか
投稿者 るきお  (社会人) 投稿日時 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:32:51
間違えました。
ForのなかにFor Each文です
投稿者 るきお  (社会人) 投稿日時 2011/3/28 23:06:16
う~ん。よくわかりません。

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

具体的なプログラムを載せて、「ここでこうしたいが、できない。または、エラーになる。」みたいに書いてもらえればもうちょっとアドバイスできるかもしれません。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/3/29 00:18:22
> For文を使うプログラムの進捗状況をプログレスバーに表示することはできますか?
For のループはごく短い時間で完了しますので、通常はプログレスバーに表示しきれません。

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

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

使うのであれば、Timer や BackgroundWorker、あるいは非同期系の処理と組み合わせて、
「長い処理」を行う部分と、その進捗状況をプログレスバーに表示する部分とを
分離したほうが良いかと思います。