• 締切済み

BackgroundWorker 表示の更新

C#2010で、BackgroundWorkerを使って進行状況ダイアログを表示しています。 ProgressChangedでProgressBarの値とTextBoxのテキストを変更していますが、ProgressBarの表示がうまく更新できません。早くてはっきりとは確認できないのですが、TextBoxはその都度指定した値が表示されているようです。 QNo.4159618 にあるように、Application.DoEvents()を試しましたが、変化ありませんでした。 Sleepを入れる方法は有効なのですが、表示が更新される最短の時間だけブロックする方法はないでしょうか? もしくはProgressBarの表示をすぐさま更新することができないでしょうか? ManualResetEventというのを試してみましたが、以下の方法では、変化ありませんでした。 ・ProgressChangedでManualResetEvent.Set() ・バックグランド処理でReportProgressを呼んだ後にManualResetEventのWaitOne()とReset()

みんなの回答

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.3

> ProgressBarに指定している値の確認は、BackgroundWorkerのProgressChanged内で > ProgressBar.Valueに値を設定する箇所で行いました。 実際の値を書いていない書き込みを「値を確認した」とは言わないんですが? ついでに、ProgressBar の設定は? ProgressBar.Value = 何を設定したら100%表示になるように設定していますか?

hanamamammm
質問者

補足

何度もありがとうございます。 > 実際の値を書いていない書き込みを「値を確認した」とは言わないんですが? すみません、意味が解りません。20とか100とか確認した値ということでしょうか? > ついでに、ProgressBar の設定は? ProgressBar.Minimum = 0 ProgressBar.Maximum = 100 設定している値は呼ばれる度、0~100(処理数回分)です。 処理数が50あれば、0、2、4、...100 という値を設定しています。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.2

TextBox が更新されて ProgressBar が更新されてないという時点でおかしい。 理由は、再描画が実行されているのでどちらも表示更新されていると予想できるから。 Sleepを入れる方法が有効というのもおかしい。 理由は、Sleep は再描画も含めて「何も処理しない」という命令だから、 状態が変わることはないから。 質問文だけ聞くと、早すぎて目が追いついていないただの錯覚か、 そもそも、ProgressBar に設定している値が変わってないのでは? って思ってしまいますが。ProgressBar に指定している値はどう やって確認したのですか?

hanamamammm
質問者

補足

ProgressBarに指定している値の確認は、BackgroundWorkerのProgressChanged内でProgressBar.Valueに値を設定する箇所で行いました。 ProgressBar.Value = e.ProgressPercentage; <--この値です。 完了時には、完了メッセージを表示する時間を取るため(見ていれば人が認識できる程度に)、Sleep(1500)後に進捗ダイアログを閉じるようにしていますが、PrgoressBarの値はあきらかに100%になっていません。。のように見えます(TextBoxは「完了しました」のメッセージが読めます)。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

確実とは言えませんが、RefreshでPaintイベントを叩き起こしてみるとか……

hanamamammm
質問者

お礼

ありがとうございます。 以下を追加してみましたが、変わりありませんでした。 progressBar.Refresh() Refresh()

関連するQ&A

  • BackgroundWorkerと同期 VB2008 VB2005

    VB2008で、BackgroundWorkerを使って重たい処理をさせています。 DoWork内で、ReportProgress(パーセント値)を呼び出して ProgressChangedメソッドで、そのときの状態を表示させています。ぷプログレスバーだけでなく、あらかじめ作成したデータをTextBoxに情報を表示させています。 しかし、ReportProgress(パーセント値)の後にSystem.Threading.Thread.Sleep(200)を入れないと、たまに ProgressChangedの中のTextBoxを表示させる処理が実行されなくなります。 ReportProgress(パーセント値)の後に同期をとる処理はSleep以外に何かあるのでしょうか? BackgroundWorkerの同期について詳しく書かれている本も探しています。

  • VB6 DoEventsの代わりは?

    お世話になります。 progressbarを表示するために、 重たい処理のループの中ではDoEventsを入れることで表示ができているのですが、 ループとループの間でprogressbarを更新するには、どのようにしたらよろしいでしょうか? ***** 現状 for i =1 to 9999 重い処理 Frm_ProgressBar.ProgressBar1.value = 進捗数 DoEvents next i ***** やりたいこと for i =1 to 9999 重い処理A next i Frm_ProgressBar.ProgressBar1.value = 進捗数 DoEvents for i =1 to 9999 重い処理B next i

  • WebBrowserでHtmlを取得

    WebBrowserでHtmlを取得する方法をおしえてください フォーム上に、WebBrowser1、TextBox1、Button1を配置しています。 TextBox1にHtmlを表示し、Button1は、WebBrowser1に表示している WEBページを更新します。 やりたい事  (1)フォームを開いた時に、URLで指定したWEBページを表示させ   TextBox1にHtmlを表示させる。  (2)Button1をクリックした時、表示しているWEBページを更新する。   更新後のHtmlをTextBox1に表示させる。  (3)TextBox1の表示が完了したらHtmlを処理する。(未着手) 現在、(1)は動作するのですが、(2)が動作しません(TextBox1のHtmlが更新されない) Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load WebBrowser1.Navigate(オッズURL):webcompflag = False Do While (webcompflag = False) System.Windows.Forms.Application.DoEvents() System.Threading.Thread.Sleep(10) Loop TextBox1.Text = WebBrowser1.Document.Body.InnerHtml End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "" If Not WebBrowser1.Url.Equals("about:blank") Then WebBrowser1.Refresh() : webcompflag = False Do While (webcompflag = False) System.Windows.Forms.Application.DoEvents() System.Threading.Thread.Sleep(10) Loop TextBox1.Text = WebBrowser1.Document.Body.InnerHtml End Sub 何がいけないのか分かりません よろしくお願いします。

  • TextBoxの入力・表示の判別方法

    VBAでTextBoxを入力・表示用兼用にしたProgを作っています。 表示の場合は、TextBox.Textへデータをセットしています。 TextBoxの値が変化した場合は、Changeイベントが発生しますが、 TextBox_change()の処理において、 イベントがキーボード入力で発生したものか、Progの内部セットで発生したものかを判別するのに苦労しています。 適切な判別方法の教えて頂きたくよろしくお願いします。

  • シート内で変更があった場合に、更新日付・時間を表示

    エクセルで”値の更新(Vlookupを使ってブックリンクしています)”後、 値に変化があった場合、更新された日付・時間を表の「A2」箇所に 表示させたい場合は、どうすればよいでしょうか。 WEBからコピペした下記マクロを使ってみました。 --------------------------------------------------------------------- Function LastSaveTime() Application.Volatile LastSaveTime = ThisWorkbook.BuiltinDocumentProperties("Last save time").Value End Function --------------------------------------------------------------------- こちらですと、直接セルに文字を入力した場合は更新時間が変化するのですが、 ブックリンクの”値の更新”で再計算された場合には、時間が変更されませんでした。 値の更新後、値に変化があった場合にも日時が更新されるようにするには どうしたらよろしいでしょうか。 上手く説明ができず、申し訳ございませんが宜しくお願い致します。

  • 新しいフォームへのデータを渡したい

    Visual studio 2005にてフォームアプリケーションを作成しています。 メインとなるフォーム(form.vb)と、ダイアログ表示用のフォーム(dialog.vb)を使い、メインでの値をダイアログ用のフォームの方で表示させたいのです。 メインのTextBox1にテキストを入力させ、「実行」ボタンを押すとダイアログ表示用フォームが立ち上がり、ダイアログのTextBox1に同じものを表示させたい・・・という寸法です。 できるだけ簡素なコードでこれを行うにはどうすればいいでしょうか? よろしくお願いします。

  • MFC モーダルダイアログに動的表示

    MFC DFrom でモーダルダイアログに刻々と変化する解析結果を表示したいと思っています。が・・実装方法がわかりません。 どなたか、モーダルダイアログに動的表示する方法を教えていただけないでしょうか

  • iPhone ダイアログが消えない

    iPhoneで 「このデバイスの自動ダウンロードを有効にしますか? 」 というダイアログが、スリープ解除する度に表示され大変邪魔で困っています。 OSは最新です。 機能制限もかけていません。 ダイアログの指示通りにiTunes StoreとApp Storeの設定の、 ミュージック、App、ブックとオーディオブックのスイッチをオンにしても 即座自動でにオフになって(スライドできない)しまいます。 アップデートだけはオンになりますが、オフにできません。 何をしてもスリープから解除する度、必ずダイアログが表示されてしまいます。 Appのバックグラウンド更新もオンにしてますが改善されません。 大変鬱陶しく、困っております。 改善策を教えていただけないでしょうか。 宜しくお願い致します。

  • エクセル 値の更新

    シート1のA1の値をシート2のあるセルに表示させるためにシート2のあるセルに =1!A1 といれました。 入力後、すぐに反映されていたのですが、あるときを境にこの入力をすると”値の更新”という保存時のダイアログのようなものが開表示されるようになりました。 分からないなりにもあてずっぽで更新先をシート1にして、なんとか対応していたのですが、同じようにしているのもかかわらず、リンクさえしなくなりました。 これはどうなっているのでしょうか。 原因がまったくわかりません。 最初のように、すぐに反映させるにはどうすればよいのでしょうか。 よろしくお願いいたします。

  • xlsの関数の計算範囲にバックグラウンドで値が更新されるcsvファイル

    xlsの関数の計算範囲にバックグラウンドで値が更新されるcsvファイルのセルを指定したいのですがいい方法はないですか csvファイルは開いてしまうと値が更新されません

専門家に質問してみよう