2014-07-13 1 views
2

의 행의 수에 따라 C# 진행률 표시 줄 :나는 C#에서 다음과 같은 작업을 수행하고자하는 파일

  1. 특정 텍스트 파일에서 라인의 양을 읽어보십시오.
  2. 텍스트 파일의 줄 크기에 따라 각 줄을 읽고 진행률 막대를 업데이트하십시오.

    private void Form1_Load(object sender, System.EventArgs e) 
    { 
        backgroundWorker1.RunWorkerAsync(); 
    } 
    
    private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
        int lineCount = 0; 
        int max = 100; 
        float percent; 
        using (var reader = File.OpenText(@"C:\file.txt")) 
        { 
         toolStripLabel1.Text = "Initializing..."; 
    
         while (reader.ReadLine() != null) 
         { 
          lineCount++; 
         } 
         reader.Close(); 
         for (int i = 0; i < lineCount; i++) 
         { 
          percent = (max/lineCount); 
          toolStripLabel1.Text = i.ToString() + " - " + percent + "%"; 
          bw.ReportProgress(Convert.ToInt32(percent)); 
          percent = percent + percent; 
          // Thread.Sleep(100); 
    
         } 
        } 
    } 
    
    private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
        progressBar1.Value = e.ProgressPercentage; 
        // progressBar1.Value = (int)(((decimal)currentPosition/(decimal)length) * (decimal)100); 
        this.Text = e.ProgressPercentage.ToString(); 
    } 
    

    사람이 제대로 계산하고 파일에서 읽고있는 무슨 라인에 따라 진행 표시 줄을 표시하는 방법에 대한 아이디어가 :

이것은 내가 지금까지 가지고 무엇인가? 사전에

감사합니다!

+1

입니다. 그리고 그것은 아마도'(i/(float) lineCount) * max'이어야합니다. 또한,'toolStripLabel1.Text'를 다른 스레드에서 설정하면 잘 작동하지 않습니다! – Chris

답변

0

이 시도 해야 할 몇 가지가 있습니다

% = (최대/lineCount를) 대체는; 이

퍼센트 = (100.0 * I/lineCount)와

;

제거 percent = percent + percent;

4

코드 몇 가지 문제가 있습니다

  1. 먼저가 모두 읽은 후 다음 진행률 표시 줄을 업데이트를 시작, 파일을 읽고는, 어떤 정말로 말이되지 않습니다.
  2. 비율 계산에서 정수 나누기를 수행하고 있습니다.
  3. 계산 비율이 적절하지 않습니다.
  4. ToolStripLabel을 작업자 스레드에서 업데이트하고 있습니다.

이 시도 :

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var files = File.ReadAllLines(@"C:\file.txt"); 
    for(int i = 0; i < files.Length; i++) 
    { 
     var line = files[i]; 

     // do work on the current line here 

     int percentage = (int)((i/(double)files.Length) * 100.0); 
     bw.ReportProgress(percentage); 
    } 
} 

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

를 파일이 매우 큰이며, 당신은 그것을 읽을의 원래 방식으로 돌아가지만, 모든 라인에 대한 진행 상황을 업데이트해야 시간이 걸립니다 실제 읽기의 경우 후에 대신에. 그렇지만 파일을 읽기 전에 얼마나 많은 행이 있는지 알지 못하는 문제로 돌아 왔습니다. 이 경우 파일의 전체 크기와 비교하여 읽은 바이트 수/문자 수를 기반으로 진행 상황을 예측할 수 있습니다.이 전체 크기를 읽지 않고 얻을 수 있습니다.

+0

고마워, 이것은 매우 유용했다! – user3733946

0

이 시도 : 진행 표시 줄에 대한

private void InvokeLabel(string text) 
{ 
    if (toolStripLabel1.InvokeRequired) 
    { 
     toolStripLabel1.Invoke(new Action<string>(InvokeLabel), text); 
    } 
    else 
    { 
     toolStripLabel1.Text = text; 
    } 
} 

를가`(최대/lineCount)`에서 당신은 정수 나누기를하고있는 동일한 코드

관련 문제