2012-04-29 6 views
3

これはイベントのコードです。ProgressChangedイベントとRunWorkerCompletedイベントです。問題は、progressBarが関数の処理操作が終了する前に100%高速化していることです。ですから、progressBarが最大100%の場合、progressBarは101%にはならないのでエラー例外が発生します。backgroundworkerを使用しようとしていますが、動作しません - なぜですか?

私は何とかprogressBarが処理/進捗状況に従って進捗するようにする必要があります。私はDoWorkイベントの計算に何か問題があると思います。

i = 0; 

backgroundWorker1.WorkerSupportsCancellation = true; 
backgroundWorker1.WorkerReportsProgress = true; 
backgroundWorker1.RunWorkerAsync(); 

そして、これがBackgroundworkerのイベントです:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 
    //int currentLength; 
    //int currentIndex; 
    //int lastIndex = 0; 
    string startTag = "T256=\""; 
    string endTag = "\""; 
    int startTagWidth = startTag.Length; 
    //int endTagWidth = endTag.Length; 
    int index = 0; 

    h = new StreamReader(@"d:\DeponiaSplit\testingdeponias_Translated.txt"); 

    while ((line = h.ReadLine()) != null) 
    { 
     if (index > f.LastIndexOf(startTag)) 
     { 
     break; 
     } 

     int startTagIndex = f.IndexOf(startTag, index); 
     int stringIndex = startTagIndex + startTagWidth; 
     index = stringIndex; 
     int endTagIndex = f.IndexOf(endTag, index); 
     int stringLength = endTagIndex - stringIndex; 

     if (stringLength != 0) 
     { 
     string test = f.Substring(stringIndex, stringLength); 
     f = f.Substring(0, stringIndex) + line + f.Substring(stringIndex + stringLength); 

     if (listBox1.InvokeRequired) 
     { 
      textBox1.Invoke(new MethodInvoker(delegate { textBox1.Text = line; })); 
     } 

     i = i + 1; 
     System.Threading.Thread.Sleep(500); 
     worker.ReportProgress((i * 1)); 
     } 
    } 

    h.Close(); 

    StreamWriter w = new StreamWriter(@"D:\New folder (24)\000004aa.xml"); 
    w.AutoFlush = true; 
    w.Write(f); 
    w.Close(); 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    //this.progressBar1.Text = (e.ProgressPercentage.ToString() + "%"); 
    progressBar1.Value = e.ProgressPercentage; 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if ((e.Cancelled == true)) 
    { 
     this.progressBar1.Text = "Canceled!"; 
    } 
    else if (!(e.Error == null)) 
    { 
     this.progressBar1.Text = ("Error: " + e.Error.Message); 
    } 
    else 
    { 
     this.progressBar1.Text = "Done!"; 
    } 
} 

なぜdoesnの」私がしたコンストラクタで

Int i; 

を:私は追加Form1トップで

それは正しく動作しますか?今、私はプログレスバーに%が表示され、ラベルが、私はちょうどにプログレスバー緑色の進行状況を無効にしたくないのProgressBarに応じて移動するラベルを追加したいのFileStream

を使用して作業する

%を追加し、数値をパーセンテージで示します。

だから私がやったProgressChangedイベントに:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar1.Value = e.ProgressPercentage; 
    label3.Text = (e.ProgressPercentage.ToString() + "%"); 
} 

しかし、それは動作しません - label13は%が、私は1%のようなものを見たいと思って1に変更だけで移動していません... 2%... 3%...などです。どうしたらいいですか?

+0

ここからわかるように、行が読み込まれるたびにプログレスバーを更新したいですか? – Tudor

+0

「しない」を短くしたい場合は、あなたが常時使用しているように、 'dosent'ではなく' doesn't'を取得します。 –

+0

新しい質問が正しく表示されますか?ラベルには1%、2%、3%の代わりに%、1、2、3が表示されますか?たぶん、label.Widthが正しくないので、コンテンツがカットされていますか?あなたはlabel.AutoSizeを試すことができます... – Hinek

答えて

4

なぜFile.ReadAllLinesを使用しないと、文字列の配列を返します。あなたが行の合計数に処理しているラインの割合として、あなたの進捗状況を報告できます。

string[] lines = File.ReadAllLines(@"d:\DeponiaSplit\testingdeponias_Translated.txt"); 
// ... 
worker.ReportProgress(i * 100/lines.Length); 
+2

正しい考えですが、整数除算のために、あなたのコードは常にゼロを与えます。代わりに 'i * 100/lines.Length'を試してみてください。 –

+1

私は最後にこうしました:using(var fs = new FileStream(@ "d:\ DeponiaSplit \ testingdeponias_Translated.txt"、FileMode.Open、FileAccess.Read) { using(var h = new StreamReader (fs)) { 文字列; while((行= h.ReadLine())!= null) { int percent =(int)(fs.Position * 100/fs.Length); backgroundWorker1.ReportProgress(パーセント);とその働き。ありがとうございました – user1363119

+0

ベン、ありがとう、私はそれを編集... – Hinek

0

「i」がでインクリメントされた後に「ReportProgress()」メソッドは、右の「I」を報告しています"i + 1"の文章。私はあなたの提供されたパラメータと一致する文字列を見つけるたびに増分される変数です。ここでの問題は、コンテキストなしで整数を報告していることです。あなたのパラメータに一致する文字列がファイル内のいくつの行に含まれているか知っていますか?私は報告(i/totalNumLinesMatchingParameters)* 100を提案します。これはパーセンテージで数値を報告します。ただし、これにはFileの記述アクションは含まれません。したがって、進行状況バー/プログレスバーのラベルにファイルを書き込む操作を含める場合は、上記を異なる方法でスケールすることができます。

+0

その作業!私はFileStreamを使用しました。今私は主な質問を更新し、別の質問を追加しました。 – user1363119

関連する問題