トップ回答者
プログレスバーが100%にならない

質問
-
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
回答
-
■疑問
画面を更新する、プログレスバーを更新する余裕がないのでは?
プログレスバーを100%にさせる方法を教えてください。
(手元の環境では100%(右端)まで到達するため、環境によるか、サンプルコードでは再現しない可能性があります)
Thread.Sleepはスレッド自体を止めてしまうため、画面の更新が行われなかったり、応答なしと表示される原因になります。
Timerコンポーネントを使って、Intervalを3000(3秒)に設定し、処理が終わったらEnabledをtrueに設定して、TickイベントでCloseすれば良いかもしれません。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。- 回答としてマーク Land Ocean 2009年5月25日 23:15
すべての返信
-
■疑問
画面を更新する、プログレスバーを更新する余裕がないのでは?
プログレスバーを100%にさせる方法を教えてください。
(手元の環境では100%(右端)まで到達するため、環境によるか、サンプルコードでは再現しない可能性があります)
Thread.Sleepはスレッド自体を止めてしまうため、画面の更新が行われなかったり、応答なしと表示される原因になります。
Timerコンポーネントを使って、Intervalを3000(3秒)に設定し、処理が終わったらEnabledをtrueに設定して、TickイベントでCloseすれば良いかもしれません。
解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。- 回答としてマーク Land Ocean 2009年5月25日 23:15
-
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