2011-09-25 140 views
1

我有一個窗體應用程序使用一個類(它的名字是Parser) 這個窗體有一個按鈕,當我點擊窗體窗體應用程序按鈕時,它調用一個解析器類的方法。添加進度條

行之後

這種方法只是簡單的閱讀文本文件的行,寫每一行分開的文件...

我想一個進度條,以顯示進度添加到窗體(這是一個非常大的文件)

任何想法該怎麼做?我在Parse class 2屬性中有一個用於文件中的行數,第二個是已經檢查了多少行。

這裏是我的button2_Click功能

private void button2_Click(object sender, EventArgs e) 
{ 
     if (this.textBox1 != null & this.textBox2 != null) 
     { 
      inst.init(this.textBox1.Text, this.textBox2.Text); 
      //this.progressBar1.Show(); 

      inst.ParseTheFile(); 
      System.Windows.Forms.MessageBox.Show("Parsing finish successfully"); 
     } 
} 
+2

你應該命名你的控件。 – SLaks

回答

2

你可以這樣做:

private void button1_Click(object sender, EventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem((obj) => 
    { 
     var lines = File.ReadLines(@"D:\test.txt"); 
     var count = lines.Count(); 

     for(int i = 0; i < count; i++) 
     { 
      // some parse work 
      Invoke(new Action(() => 
      { 
       progressBar1.Value = (i * 100)/count; 
      })); 
     } 
    }); 
} 

在上面的例子中,它只是簡單地創建,以不阻塞UI線程在後臺線程,直到Invoke方法被調用。 Invoke方法是必要的,爲了操縱一個Control,當前線程不是所有者。它需要一個委託,並在擁有Control的線程上運行此委託。

如果解析這些行是一項耗時的任務,那麼您甚至可以儘可能地將foreach循環並行化。舉例:

private void button1_Click(object sender, EventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem((obj) => 
    { 
     var lines = File.ReadLines(@"D:\test.txt"); 
     var count = lines.Count(); 

     Parallel.For(0, count, i => 
     { 
      // some parse work 
      Invoke(new Action(() => 
      { 
       progressBar1.Value = (i * 100)/count; 
      })); 
     }); 
    }); 
} 
+0

此代碼將凍結用戶界面。 –

+0

@HansPassant,怎麼回事?所有代碼都在後臺線程上執行。它不會阻止UI線程。 – ebb

+0

它用調用請求來氾濫UI線程,它不會執行其常規的低優先級職責了。像繪畫一樣。 –

1

normaly你應該去和你媒體鏈接嘗試寫一些。 因爲我覺得你越來越對* begining」身邊,我會建議尋找到BackgroundWorker及其ProgressChanged事件/系統(這裏是一個intro它)。

當然,你必須將你的ParseTheFile碼成這

對於更高級的東西,有幾個選項:

  • 一個參數添加到ParseTheFile(例如Action),用於設置進度
  • 回報IObservableParseTheFile指示進度
  • 使用一些靜態服務ParseTheFile使用表示進度(不勸)
  • ...(我敢肯定,其他永世會發現很多更多的選擇)

(請注意,如果您使用另一個線程,大多數此選項都需要使用Control.Invoke返回您的UI-Thread以設置進度條值 - 如果文件很大,我會建議您使用另一個線程)

對於初學者我會去與backgro undworker - 恕我直言,這是罰款,如果你不想在你第一次運行去固體(德興模式/堅持的原則);)

0

只是用數學來計算百分比 像:

//While Reading 
NumOfLines++; 
int Percentage = (NumOfLines * 100)/TotalLines ; 
ProgressBar.Value = Percentage; 

而且很可能把INT .ParseTheFile();到後臺工作者和/或線程內。