- 締切済み
BackgroundWorker 表示の更新
C#2010で、BackgroundWorkerを使って進行状況ダイアログを表示しています。 ProgressChangedでProgressBarの値とTextBoxのテキストを変更していますが、ProgressBarの表示がうまく更新できません。早くてはっきりとは確認できないのですが、TextBoxはその都度指定した値が表示されているようです。 QNo.4159618 にあるように、Application.DoEvents()を試しましたが、変化ありませんでした。 Sleepを入れる方法は有効なのですが、表示が更新される最短の時間だけブロックする方法はないでしょうか? もしくはProgressBarの表示をすぐさま更新することができないでしょうか? ManualResetEventというのを試してみましたが、以下の方法では、変化ありませんでした。 ・ProgressChangedでManualResetEvent.Set() ・バックグランド処理でReportProgressを呼んだ後にManualResetEventのWaitOne()とReset()
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- MARU4812
- ベストアンサー率43% (196/452)
> ProgressBarに指定している値の確認は、BackgroundWorkerのProgressChanged内で > ProgressBar.Valueに値を設定する箇所で行いました。 実際の値を書いていない書き込みを「値を確認した」とは言わないんですが? ついでに、ProgressBar の設定は? ProgressBar.Value = 何を設定したら100%表示になるように設定していますか?
- MARU4812
- ベストアンサー率43% (196/452)
TextBox が更新されて ProgressBar が更新されてないという時点でおかしい。 理由は、再描画が実行されているのでどちらも表示更新されていると予想できるから。 Sleepを入れる方法が有効というのもおかしい。 理由は、Sleep は再描画も含めて「何も処理しない」という命令だから、 状態が変わることはないから。 質問文だけ聞くと、早すぎて目が追いついていないただの錯覚か、 そもそも、ProgressBar に設定している値が変わってないのでは? って思ってしまいますが。ProgressBar に指定している値はどう やって確認したのですか?
補足
ProgressBarに指定している値の確認は、BackgroundWorkerのProgressChanged内でProgressBar.Valueに値を設定する箇所で行いました。 ProgressBar.Value = e.ProgressPercentage; <--この値です。 完了時には、完了メッセージを表示する時間を取るため(見ていれば人が認識できる程度に)、Sleep(1500)後に進捗ダイアログを閉じるようにしていますが、PrgoressBarの値はあきらかに100%になっていません。。のように見えます(TextBoxは「完了しました」のメッセージが読めます)。
- D-Matsu
- ベストアンサー率45% (1080/2394)
確実とは言えませんが、RefreshでPaintイベントを叩き起こしてみるとか……
お礼
ありがとうございます。 以下を追加してみましたが、変わりありませんでした。 progressBar.Refresh() Refresh()
補足
何度もありがとうございます。 > 実際の値を書いていない書き込みを「値を確認した」とは言わないんですが? すみません、意味が解りません。20とか100とか確認した値ということでしょうか? > ついでに、ProgressBar の設定は? ProgressBar.Minimum = 0 ProgressBar.Maximum = 100 設定している値は呼ばれる度、0~100(処理数回分)です。 処理数が50あれば、0、2、4、...100 という値を設定しています。