2011-11-24 3 views
-2

다음 코드를 사용하고 있습니다.C에서 진행 표시 줄의 텍스트

왜 제대로 실행되지 않습니까?

private void Form1_Shown(object sender, EventArgs e) 
{ 
    for (int i = 1; i <= 100; i++) 
    { 
     Application.DoEvents(); 
     Thread.Sleep(200); 

     progressBar1.Refresh(); 
     progressBar1.Value = i; 
     progressBar1.CreateGraphics().DrawString(i.ToString() + "%", 
      new Font("Arial", (float)8.25, FontStyle.Regular), 
      Brushes.Black, new PointF(progressBar1.Width/2 - 10, 
       progressBar1.Height/2 - 7)); 


    } 
} 

갱신 :

왜 항상 텍스트를 표시하지 않는 이유는 무엇입니까?

+4

제대로 실행되지 않는 항목은 무엇입니까? – Alex

+5

UI 스레드를 차단하고 있습니다. 그러지 마. 오른쪽에있는 관련 질문을 살펴보십시오. –

+1

또한 대부분의 * 경우 DoEvents = evil입니다. (http://hashvb.earlsoft.co.uk/Why_DoEvents_Are_Evil) –

답변

1

이 기능은 작동합니다. 스레드 수면을 200ms 이상으로 설정했지만 작동합니다. 문제는 UI 스레드에서 작업 한 것이므로 결코 업데이트되지 않습니다. 더 나은 시야를 위해 글꼴 색상을 변경하십시오.

private void Form1_Load(object sender, EventArgs e) 
{ 
    Task t = new Task(() => StartUpdate()); 
    t.Start(); 

    t.ContinueWith(task => Console.WriteLine("Done loading")); 
} 

private void StartUpdate() 
{ 
    for (int i = 1; i <= 100; i++) 
    { 
    UpdateProgressBar(i); 
    } 
} 

private void UpdateProgressBar(int i) 
{ 
    if (progressBar1.InvokeRequired) 
    { 
    progressBar1.Invoke(new Action<int>(UpdateProgressBar), new Object[] { i }); 
    } 
    else 
    { 
    Thread.Sleep(200); 
    progressBar1.Refresh(); 
    progressBar1.Value = i; 
    progressBar1.CreateGraphics().DrawString(i.ToString() + "%", new Font("Arial", 
              (float)10.25, FontStyle.Bold), 
              Brushes.Red, new PointF(progressBar1.Width/2 - 10, progressBar1.Height/2 - 7)); 
    } 
} 
+0

항상 텍스트가 표시되지 않는 이유는 무엇입니까? –

+0

진행률 막대가 텍스트와 겹치기 때문에! – Alex

+0

제게 올바른 길을 보여주세요. –

-2

사용하십시오. 이 작업을 수행하는 좋은 방법이 있지만 질문이 작동하지 않는 이유는 Application.DoEvents() 때문입니다.

private void Main_Shown(object sender, EventArgs e) 
    { 
     for (int i = 1; i <= 100; i++) 
     { 
      progressBar1.Value = i; 
      int percent = (int)(((double)(progressBar1.Value -progressBar1.Minimum)/(double)(progressBar1.Maximum - progressBar1.Minimum)) * 100); 
      using (Graphics gr = progressBar1.CreateGraphics()) 
      { 
       gr.DrawString(percent.ToString() + "%", SystemFonts.DefaultFont, Brushes.Black, new PointF(progressBar1.Width/2 - (gr.MeasureString(percent.ToString() + "%", SystemFonts.DefaultFont).Width/2.0F), progressBar1.Height/2 - (gr.MeasureString(percent.ToString() + "%", SystemFonts.DefaultFont).Height/2.0F))); 
      } 
      System.Threading.Thread.Sleep(200); 
     } 
    } 
+0

for 루프가 주 스레드 (GUI 업데이트 책임자)와 같은 스레드에 있기 때문에 UI가 업데이트되지 않습니다. 빈 폼에 붙여 넣기 만하면 진행률 막대를 추가 할 수 있습니다. – Alex

+0

그럼 Thread.Sleep() 메서드 때문일 것입니다. 나는 형식으로 이미 그것을 시도하고 그것이 효과가있다. 수면의 값은 200 이상이어야합니다. 내 물건을 투표하기 전에 해본 적이 있니? 내가 가지고 있기 때문에 너는하지 않았을거야. –

+0

누군가 내 대답을 받아 들였습니다. downvoting하기 전에 더미 응용 프로그램에서 코드를 사용해보십시오. 당신이 그걸 되돌릴 수 있기를 바랍니다. –

관련 문제