2012-09-16 16 views
6

私は大量のデータ行を含む大きなtext fileを持っています。私のアプリケーションでは、このファイルを開き、正規表現にマッチして各行を読み込み、Datagridviewに表示します。生成される行の総数は約2000です(時にはさらに、非常に巨大な)。プログレスバーとファイル読み込み

この操作では、かなりの時間がかかります。だから、私はバックグラウンドワーカーを使ってこのコードを別のスレッドに移しました。ただし、私が失敗している進行状況バーにロードステータスを表示したいという点を除いて、すべては問題ありません。

私はFileInfoクラスを使用してファイルの長さを取得してから、この値をProgressbar.Maximumに与えました。 "3"行を含むテストファイルが "305"のファイル長を返したため、正しいアプローチではないようです。私はこのように与えなければならないステップ間隔をどれほど理解できないのか分からない。

コードサンプル:

FileInfo ff = new FileInfo(openFileDialog1.FileName); 
int fsize= Convert.ToInt32(ff.Length); 
int val=1; 
pgbar_load.Invoke(new MethodInvoker(delegate { pgbar_load.Maximum = fsize; })); 

とループ内:

++val; 
wk.ReportProgress(val); 

、その後:私は探しています

private void bgwrkr_load_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    pgbar_load.Value = e.ProgressPercentage; 
} 

だから、二つのこと:

  1. プログレスバーの最大値を設定します。
  2. ステップインデックスを正しく設定する。

私は前進する方法を提案してください。

答えて

6

Progressbar.Maximumを100に保ちます。次に、読み込みデータをint変数で追跡します。 UIスレッドでループを実行します(タイマーを使用してこれを行うことができます)。これは、読み込みバイト数をチェックすることによってプログレスバーのパーセント値を設定します。例えば。ファイルのサイズが含まれているint totalRead;int totalFileSizeに読み込みバイトを格納すると仮定します。

myProgressBar.Value = Convert.ToInt32(Math.Ceil(100d * totalRead/totalFileSize)); 

これをタイマーティックイベントハンドラに入れることができます。プログレスバーが徐々に100%になります。ファイルの読み込みが完了したら、タイマーを無効にします。

+0

どのように私はtotal totalRead値を意味するたびに、合計読み取りバイト数を読むことができますか?まず最初に、すべてのファイルを読み込み、そのデータを汎用リストに格納します。そして、ループで、進捗状況を表示しているDataGridの各行を更新します。 – Cdeez

+0

私が何をしているのかという質問の中で、追加されたコードを見ることができます。 – Cdeez

+0

この回答を編集しても結果は得られません--- 'totalRead'と' totalFilesize'は整数であれば、結果は常にゼロです(integerの結果の型キャスト)、100d * 0 = 0となる。そして、その 'Math.Ceiling();' – Cdeez

関連する問題