none
プログレスバーが100%にならない RRS feed

  • 質問

  • Visual Studio 2005で開発しています。以下の要件を満たすようにプログレスバーを使っていますが、挙動がおかしいです。

    ■目的
    Form1のボタンを押すと、Form2が表示され、Form2上プログレスバーが進んで、100%になったら、3秒を待ってForm2を閉じる。

    ■挙動
    ソースコード上プログレスバーが100%になるはずだが、Form2画面上プログレスバーの進捗が80%程度で止まり、その後3秒経過後Form2が閉じる。

    ■ソースコード
    <Form1>
    Form1にボタンButton1を追加し、以下のイベントハンドラを追加。
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 frmNew = new Form2();
                frmNew.ShowDialog(this);
                frmNew.Dispose();
            }

    <Form2>
    Form2にprogressBar1を追加し、以下のイベントハンドラを追加。

            private void Form2_Shown(object sender, EventArgs e)
            {
                progressBar1.Minimum = 0;
                progressBar1.Maximum = 10000;
                progressBar1.Value = 0;

                for (int i = 0; i <= 10000; i++)
                {
                    progressBar1.Value = i;
                    progressBar1.Refresh();
                    Application.DoEvents();
                }

                System.Threading.Thread.Sleep(3000);        //3秒待ち
                this.Close();
            }

    ■疑問
    プログレスバーを100%にさせる方法を教えてください。


    Land Ocean
    2009年5月25日 17:00

回答

  • ■疑問
    プログレスバーを100%にさせる方法を教えてください。
    画面を更新する、プログレスバーを更新する余裕がないのでは?
    (手元の環境では100%(右端)まで到達するため、環境によるか、サンプルコードでは再現しない可能性があります)
    Thread.Sleepはスレッド自体を止めてしまうため、画面の更新が行われなかったり、応答なしと表示される原因になります。

    Timerコンポーネントを使って、Intervalを3000(3秒)に設定し、処理が終わったらEnabledをtrueに設定して、TickイベントでCloseすれば良いかもしれません。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク Land Ocean 2009年5月25日 23:15
    2009年5月25日 21:46
    モデレータ

すべての返信

  • ■疑問
    プログレスバーを100%にさせる方法を教えてください。
    画面を更新する、プログレスバーを更新する余裕がないのでは?
    (手元の環境では100%(右端)まで到達するため、環境によるか、サンプルコードでは再現しない可能性があります)
    Thread.Sleepはスレッド自体を止めてしまうため、画面の更新が行われなかったり、応答なしと表示される原因になります。

    Timerコンポーネントを使って、Intervalを3000(3秒)に設定し、処理が終わったらEnabledをtrueに設定して、TickイベントでCloseすれば良いかもしれません。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク Land Ocean 2009年5月25日 23:15
    2009年5月25日 21:46
    モデレータ
  • Azuleanさん

    ご回答ありがとうごいます!
    ご教授の方法でうまくいきました。ソースコードは以下の通りです。

            private void Form2_Shown(object sender, EventArgs e)
            {
                progressBar1.Minimum = 0;
                progressBar1.Maximum = 10000;
                progressBar1.Value = 0;

                for (int i = 0; i <= 10000; i++)
                {
                    progressBar1.Value = i;
                    progressBar1.Refresh();
                    label1.Text = i.ToString();
                    label1.Update();
                    Application.DoEvents();
                }

                timer1.Enabled = true;
                //System.Threading.Thread.Sleep(3000);        //3秒待ち
                //this.Close();
            }

            private void Form2_Load(object sender, EventArgs e)
            {
                timer1.Interval = 3000;
            }

            private void timer1_Tick(object sender, EventArgs e)
            {
                this.Close();
            }


    Land Ocean
    2009年5月25日 23:15