2009-05-29 6 views
2

주 스레드에는 Windows 양식이 있고 계산에는 다른 스레드가 있습니다. 내 양식의 상태 표시 줄을 다른 스레드에서 수행중인 작업에서 업데이트하고 싶습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?다른 스레드에서 진행률 막대 업데이트

지금까지 내가 시도한 모든 것이 단지 매우 천천히 실행됩니다. Visual Studio 2005를 사용하고 있습니다.

+0

천천히 무엇을해야합니까? 어떻게 스레드를 사용합니까? –

답변

2

메인 스레드에서만 사용자 인터페이스를 업데이트해야합니다. 그렇지 않으면 문제가 발생합니다. Invoke를 호출하여 스레드 컨텍스트를 전환 할 수 있습니다. 좋은 게시글이 here입니다.

1

메인 스레드로 메시지를 보내고 메시지를 확인해야하지만 진행률 표시 줄을 업데이트 할 수 있습니다. 폴링 기능과 동일한 기능을 수행 할 수도 있습니다.

1

Control.Invoke과 같은 마샬링 기술을 사용하면 UI 요소를 안전하게 조작 할 수있는 UI 스레드에서 대리인을 실행할 수 있지만 그 방법은 그리 좋지 않습니다. 사실, 간단한 진도 정보를 업데이트하는 것이 전부라면 끔찍한 접근입니다.

는 지금까지이 작업을 수행하는 가장 좋은 방법은 다음과 같습니다

  • 이 작업자 스레드가 공유 변수에 진행 정보를 게시하게한다.
  • 당신의 UI 스레드가 System.Windows.Forms.Timers을 통해 당신을 위해 잘 작동하는 간격으로 폴링하도록하십시오.

다음과 같이 표시됩니다.

public class Example : Form 
{ 
    private volatile int percentComplete = 0; 

    private void StartThreadButton_Click(object sender, EventArgs args) 
    { 
    StatusBarUpdateTimer.Enabled = true; 
    new Thread(
    () => 
     { 
     for (int i = 1; i <= 100; i++) 
     { 
      DoSomeWork(); 
      percentComplete = i; 
     } 
     }).Start(); 
    } 

    private void StatusBarUpdateTimer_Tick(object sender, EventArgs args) 
    { 
    yourStatusBarPanel.Text = percentComplete.ToString() + "%"; 
    StatusBarUpdateTimer.Enabled = percentComplete < 100; 
    } 
} 

이 있기 때문에 잘 작동 :

  • UI 스레드는 UI가 그것이 있어야 ... 길을 업데이트되는시기와 빈도 지시에 도착!
  • Invoke의 경우처럼 작업자 스레드가 UI 스레드의 응답을 기다릴 필요가 없습니다.
  • Invoke이 부과하는 UI와 작업자 스레드 간의 긴밀한 연결이 끊어집니다.
  • 상당히 효율적으로 ... 상당히.
  • UI 및 작업자 스레드 모두에서 처리량이 증가합니다.
  • BeginInvoke의 경우와 같이 UI 메시지 큐를 포화시킬 가능성은 없습니다.
  • 작업자 스레드에서 UI를 업데이트해야 할 때마다 Invoke 코드로 코드를 낭비하지 않아도됩니다.