2011-09-25 7 views
1

하나의 클래스 (이름은 Parser)를 사용하는 Windows 양식 응용 프로그램이 있습니다. 이 양식에는 단추가 있으며 Windows 응용 프로그램 단추를 클릭하면 파서 클래스 방법 중 하나가 호출됩니다.진행률 막대 추가

가 내가 진행 상황을 보여주기 위해 폼에 진행 표시 줄을 추가 할

(이것은 매우 큰

이 방법을 단순히 읽기 텍스트 파일의 라인 라인 후 파일을 분리하는 각 라인을 쓰기 ... 파일)

어떻게 할 수 있습니까? Parse 클래스에는 파일의 행 수에 대한 속성 2 개와 이미 체크 된 행의 두 번째 속성이 있습니다.

여기 normaly 당신이 가서 allready 시도 무엇에 대한 몇 가지를 작성해야 내 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

당신이 할 수있는 다음 Invoke 메서드가 호출 될 때까지

위의 예에서
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 스레드를 차단하지 위해 백그라운드 스레드를 생성한다. Control으로 현재 스레드가 소유자가 아닌 것을 조작하려면 Invoke 메서드가 필요합니다. 델리게이트가 걸리고 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

이 코드는 UI를 고정시킵니다. –

+0

@HansPassant, 어떻게 오셨습니까? 모든 코드는 백그라운드 스레드에서 실행 중입니다. 그것은 UI 스레드를 차단하지 않을 것이다. – ebb

+0

UI 스레드에 호출 요청이 넘쳐 흐르지 만 더 이상 일반 우선 순위 업무를 수행하지 않습니다. 그림처럼. –

1

입니다. 난 당신이 (그것에 intro입니다 여기에) 더 나는 BackgroundWorker과 ProgressChanged 이벤트/시스템에보고 조언한다 것 * 태초 "측면에서 생각한다. 당신이로 ParseTheFile 코드를 이동해야 물론

.

  • 가 진행을
  • 돌려을 설정하는 데 사용되는 (A Action 예를 들어)를 ParseTheFile에 매개 변수를 추가 : 고급 물건이

    몇 가지 옵션이 있습니다 진행

  • 사용하는 일부 정적 서비스를 나타냅니다 당신의 ParseTheFile에서는 ParseTheFile (I 다른의 poeple는 더 많은 옵션을 찾을 것이라 확신합니다) ... (adviced되지 않음) 진행
  • 을 나타 내기 위해 사용

(다른 스레드를 사용하는 경우 진행 막대 값을 설정하기 위해 UI 스레드로 다시 돌아가려면이 옵션의 대부분이 Control.Invoke이어야 함을 명심하십시오. 파일이 클 경우 다른 스레드를 사용하는 것이 좋습니다)

초보자를 위해 나는 backgro와 함께 갈 것이다. undworker - 첫 번째 실행에 SOLID (종로 패턴/priciples을) 가고 싶지 않는 경우에 이럴 괜찮아,

0

그냥 비율 처럼 계산하기 위해 수학을 사용) :

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

을 그리고 아마도 INT를 넣어 .ParseTheFile(); 배경 작업자 및/또는 스레드 내에서.

관련 문제