プログレスバーで処理進捗を反映させる方法とは?

このQ&Aのポイント
  • backgroundWorkerを使用して重たい処理を実行する際に、プログレスバーで処理の進捗を表示する方法について悩んでいます。参考にしているページではforループを使用しているため、どのようにプログレスバーに反映させれば良いかわかりません。
  • 処理自体は仕様通りに行われていますが、大容量のファイルなどを扱うために時間がかかるため、ファイルコピーなどの各処理が完了するたびにプログレスバーに進捗を表示したいです。
  • 具体的な処理内容としては、ファイルの読み込み、ファイルのコピー、テキストの書き込みなどがありますが、これらの処理を何千回も繰り返す必要があります。どのようにすればプログレスバーに正確な進捗が表示できるか、教えていただけないでしょうか?
回答を見る
  • ベストアンサー

プログレスバーで処理進捗を反映させたいが・・・泣

backgroundWorkerで重たい処理をさせたいのですが、どのようにプログレスバーを噛ませてあげたらいいのか悩んでいます。 重たい処理はこんな感じです。 (ソースが今のPCに無いので大雑把な内容でお許し下さい) このページを参考にしています。 http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.h... 処理自体は仕様通りに出来ています。 どうしても大きいファイルなど操作するのでどうしても時間を要します。 そのため、ファイルコピーなどの各処理が終わるたびにプログレスバーに反映させたいのですが、参考にしているページだとforを用いたループでやっているのでどうやったらいいのか悩んでいます。 (単に想像力が足りないのかもしれませんが・・・) どのようにするといいか教えていただけませんでしょうか? //処理内容 ファイル読み込み ファイルコピー テキスト開く 1000行書きこむ(繰り返しでかけないので1行1行書き込み) テキスト閉じる ファイル読み込み ファイルコピー ファイルの内容を検査して間違いを修正 ファイルをリネーム ファイルを指定したサーバのパスにバラ撒く ・ ・ ・ ・ ・ こんな類似処理を何千回もする

  • mr-r00
  • お礼率93% (480/516)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

要は、worker.ReportProgress(percentage)を percentage値を適当に少しずつ増やしながら 発行していけばよいだけです。 あなたが意図しているプログレスバーは、 「こんな類似処理を何千回もする」というのを 全部完了した段階で100%にするものですか? そうであれば、その何千回ものループの中で 現在のループ回数/予定ループ回数の%値を percentageに入れてworker.ReportProgress(percentage) を発行するだけです。 何千回もループするのであれば、数十回ループして やっと1%増加するような進捗表示になると思います。 それとも、何千回ループの1回の処理の中で0%→100%に変化させ、 それを何千回か繰り返すようにしたいのでしょうか? そうであれば、各処理にだいたいどれくらいの時間がかかるか あらかじめ計測し、各処理ポイントで決めた%値をpercentageに入れて worker.ReportProgress(percentage)を発行すればよいと思います。 プログレスパーなんて、しょせん「だいたいどれくらいの進捗率か」 を表すものでしかありません。環境によっては、90%まですぐに進捗 するのに、残り10%の処理に5分かかるような表示をするがよくあったりします。

mr-r00
質問者

お礼

ありがとうございました。参考になりました。

その他の回答 (1)

  • neko1963
  • ベストアンサー率49% (127/258)
回答No.1

|ファイル読み込み |ファイルコピー |テキスト開く |1000行書きこむ(繰り返しでかけないので1行1行書き込み) |テキスト閉じる |ファイル読み込み |ファイルコピー |ファイルの内容を検査して間違いを修正 |ファイルをリネーム |ファイルを指定したサーバのパスにバラ撒く が1つの処理単位と解釈できるのであれば、この処理単位ごとにプログレスバーを1ステップ進めれば良いように思いますが・・・。

mr-r00
質問者

お礼

ありがとうございました。参考になりました。

関連するQ&A

  • vb.net コピーの進捗をプログレスバーで

    質問ばかりでもうしわけないのですが タイトルにあるようにコピーの状況を プログレスバーで表示できたらなと思い作成したのですが うまく動きません。 プログレスバー自身単独では動くのですがコピーと合わせると フリーズしてしまいます。 プログラミング経験と発想力が乏しいのでご教授いただけたら幸いです Private Sub Bt_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Bt_1.Click Dim fname1 As String = "C:\フォルダ名A" Dim fname2 As String = "C:\フォルダ名B" Dim ber1 As Integer If IO.Directory.Exists(fname1) = True Then Me.Lb_1.Text = "テキスト文字" For ber1 = 0 To 20 Me.ProgressBar1.Value = ber1 System.IO.File.Copy("コピー元テキストファイルA", "コピー先テキストファイルA", True) My.Computer.FileSystem.CopyDirectory("コピー元フォルダA", "コピー先フォルダA", True) My.Computer.FileSystem.CopyDirectory("コピー元フォルダB", "コピー先フォルダB", True) Next ber1 If IO.Directory.Exists(fname2) = True Then System.IO.File.Copy("コピー元ファイルB", "コピー先ファイルB", True) End If MessageBox.Show("終了報告テキスト", "タブ名") ' System.IO.Directory.Delete("コピー元", True) Me.ProgressBar1.Value = 0 Application.Exit() こんな感じで作成しております。 ファイル自身が1GBぐらいあるので フリーズしていないかプログレスバーや%表示でしらせたいので 教えていただけると助かります。 よろしくお願いします。

  • C#でプログレスバーを作るには?

    C#でプログレスバーを作るにはどうしたらいいのでしょうか? 例えばいくつものファイルをコピーする処理をしているプログラムがあるとします。 そういったときプログレスバーをどうカウントアップさせていけばよいのでしょうか?

  • 探しています~プログレスバーのまき戻しについて

    何か処理中のものがあり、進捗状態がプログレスバーに表示されているのですが、キャンセルボタンを押すとその処理を中断できて、それまで進んでいたプログレスバーの進捗が徐々に減っていき、最終的にゼロに戻るという仕組みの画面というか、UIを探しています。 ソフトのインストールとかファイルのコピーとか色々探しているのですがなかなか見つかりません。 似たような動作をするプログラムを作りたいので参考にしたいのですが・・・。 どなたか知っている方がいれば教えてください!

  • XMLファイルの作り方がわかりません

    http://www.atmarkit.co.jp/fdotnet/dotnettips/198aspmemcache/aspmemcache.htmlのページのASPを動作させたいと思ったんですが、XMLファイルの作成の仕方がわかりません。 わかっているのは、先頭の行に<?xml version="1.0" encoding="UTF-8" ?> と書くことくらいです。なにをどう書けばいいのかさっぱりわからないんですが。。 参考になるホームページとかあったら、教えてください。よろしくお願いします。

  • backgroundWorkerに無視される。。。

    C#のbackgroundWorkerがうまく動いてくれません。あるページを丸コピーしているのですが・・・(VC#2010ex、WINフォームアプリで作成を使用です) http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.html こちらのページを丸ごと参考にしているのですがなぜかうんともすんとも言いません・・・ どなたか原因をご教示いただけませんでしょうか? 各コントロールのプロパティも名称を合わせました。 WorkerReportsProgressプロパティをtrueに設定にもしております。 あとは、ボタンをダブルクリックしてソースの編集画面を開き丸ごとソースをコピーしました。 それでビルドしてみたのですが・・・全く動きません(T_T;)案内通りにしたのですが ちなみにダウンロードしたやつをVS2005でやってみたところちゃんと動きました。 おそらく何か足りていないかと思うのですが、まったくエラーにもならないのでどうしたらいいか初心者にはわかりません。 ご解説いただけませんでしょうか?

  • Access プログレスバー 画面固まる

    Access 2007 VBA でファイル出力処理が長いため、以下を参考にしてプログレスバーを設置しました。 http://www.moug.net/tech/acvba/0060023.htm 1,000件程度だと進行状況がちゃんと表示されるのですが、10,000件単位になるとAccess自体が応答せず、プログレスバーも途中で止まったまま、だけど処理は裏で動いているようでファイル出力自体は時間はかかりますがちゃんと出力されます。 DBアクセスを含んだファイル出力処理なので、多少時間がかかっているのかと思います。 また、私の技術の低さから処理自体に時間がかかってしまっていることもあると思いますが、私の技術では処理自体を変えて早くするのは限界です。 Access画面が固まらず、リアルタイムでプログレスバーを進行させる手段等ございましたらご教授いただけるとありがたいです。

  • プログレスバーについて

    サーバー上からファイルをダウンロードするアプリを 作成しているものです。 ClassAとClassBが存在するとして、 ClassAでファイルをダウンロードする処理を記述し、 ClassBでプログレスバーを含むダイアログを作成しています。 ClassAのファイル読み込みのループ処理のカウンターを プログレスバーのメンバー変数m_plgと同調させたい。 例 ClassA  for(i=0;i<count;i++){  } ClassB  m_plg.SetRange(0,count); m_plg.SetPos(i); かなり簡略化してます。 上記内容は実現可能だと思うのですが、メンバー変数の宣言部がおかしいのか m_plgは宣言されていませんとエラーがでます。 メンバー変数の理解不足だと思うのですが、このような処理を行いたい場合は どちらのClassにも認識されるようなコントロールのメンバー変数はどのようにして 宣言すればよろしいのでしょうか? 開発環境はVC++6.0 MFC ダイアログです。

  • MFCを使わないで、プログレスバーを表示したい。

    複数のファイルで構成されているフォルダがあって、そのフォルダのコピーを作成する処理を行うとします。 その処理の進行状況を、ダイアログボックス上に貼り付けたプログレスバーコントロールで表示したい と思っているのですが、MFCを使用しない例はネットなどで検索しても見つけることができません。 例えば、フォルダの容量の「現在○○%コピーしました。」とか、それが無理なら全体の何ファイル目を処理 しているかなどを、プログレスバーで表示することは可能ですか。 数値的な表示が無理なら、現在処理中かどうかを表示するだけでも構いません。 ご教授の程、よろしくお願いいたします。 環境:VC++6.0, WIN32 API

  • Microsoft Visual Basic 6.0のテキストエディッタについて

    VB6のテキストエディッタで行番号を表示することはできるのでしょうか? VB.NETだとできるみたいなのですが、VB6でのやり方がわかりません。 下記みたいにVB6でもしたいです。 参考:http://www.atmarkit.co.jp/fdotnet/dotnettips/380linenumber/linenumber.html よろしくお願いいたします。

  • ファイル処理をしたいのですが...

    C++を使ってファイル処理をしたいと思っています。 処理の内容は、以下の通りです。 (1) ファイルを読み込む (2) そのファイル内のあるキーワードから数カラム後の8カラム分の文字を探す (3) 次の行に移り、(2)の作業を繰り返す (4) あるキーワードが出てきたらその作業を終了 (5) その探した文字を別ファイルに出力する ちょっと分かりづらくてすみません。 初心者なもので。 何か参考になること、テキストやURL等あれば教えていただきたいです。 よろしくお願いします。

専門家に質問してみよう