2014-06-17 2 views
0

내 문제가 익숙 할 것 같은데, 내 프로그램에서 처리중인 데이터와 함께 진행률 표시 줄을 동시에 업데이트하고 싶습니다.진행률 표시 줄 업데이트 WPF 비주얼 스튜디오

저는 두 개의 창이 있습니다 : StartupWindow와 UpdateWindow. 응용 프로그램은 시작 창을 만들어서 시작합니다. 사용자는 UpdateWindow를 여는 버튼을 누를 것입니다.

Private Sub btnUpdateClick(sender As Object, e As RoutedEventArgs) Handles btnUpdate.Click 
    Dim updateWindow As New UpdateWindow 
    updateWindow.ShowDialog() 

    btnUpdate.IsEnabled = False 
End Sub 

나는 대부분의 다른 사람들이하는 오류가있어이 코드 : 다음은 버튼의 코드입니다. "다른 스레드가 그것을 소유하고 있기 때문에 호출 스레드가이 개체에 액세스 할 수"

 Private Sub updateDevice() 
      Dim currPercent As Integer 
      currPercent = ((sentPackets/totalPacketsToWrite) * 100) 
      progressLabel.content = currPercent.ToString + "%" 
      pb.Maximum = totalPacketsToWrite 
      pb.Value = sentPackets 
       If sentPackets < totalPacketsToWrite Then 
        '....update.... 
       Else 
        MsgBox("Device now has update stored on flash!") 
        '...close everything up 
       End If 
     End Sub 

  1. 를 사용하여 호출/디스패처/위임은 다른 스레드의에 업데이트를 넣을 수 시도하고 다워 : 여기

    는 지금까지 시도했던 세 가지입니다 대기열에요? 다른 스레드가 UI를 업데이트하기 위해 다른 스레드를 잠시 멈춘 것처럼 보일 수 없습니다.

  2. BackgroundWorker 클래스를 구현하고 그로부터 보고서 진행률을 사용하면 작동하지만 진행률 막대는 bw.DoWork 아래로 업데이트 할 수 있습니다. 외부 장치에서 응답을 받으면 모든 코드를 하나의 기능으로 묶는 것이 어려울 것입니다.
  3. 두 번째 창 (원본에서 호출 됨)이 작성되었으므로이 문제가 발생했습니다. 그래서 나는 다른 사람의 솔루션을 가져다가 '갱신'버튼을 유의해야 할

뭔가 내가 '취소'버튼을 추가 한 것입니다 예 : 누를 때 완전히 새로운 스레드를 생성하려고 :

Private Sub buttonStart_Click(sender As Object, e As RoutedEventArgs) Handles btnStart.Click 
       btnStart.IsEnabled = False 
       btnStart.Visibility = Windows.Visibility.Hidden 
       btnCancel.IsEnabled = True 
       btnCancel.Visibility = Windows.Visibility.Visible 
       beginUpdate() 
    End Sub 


Private Sub buttonCancel_Click(sender As Object, e As RoutedEventArgs) Handles btnCancel.Click 
       btnStart.IsEnabled = True 
       btnStart.Visibility = Windows.Visibility.Visible 
       btnCancel.IsEnabled = False 
       btnCancel.Visibility = Windows.Visibility.Hidden 
       'TODO MAKE IT CANCEL 
    End Sub 

을 그리고 업데이트/취소 버튼을 클릭 할 때마다 진행 막대가 업데이트됩니다. 버튼을 누를 때마다 현재 진행률 표시 줄이 새로 고쳐집니다. 나는 아주 당황 스럽다. 단지 하나의 창이면 사용자 인터페이스를 업데이트 할 수 있지만 ... 사용자가 새 창을 호출하는 버튼을 누르면 두 번째 창에서 아무 것도 업데이트 할 수 없다. 어떤 제안?

편집 : 필자는 긴 코드에서 업데이트 된 전역 변수를 만들었습니다. 나는 다른 어떤 짓을하기 전에 이상이있는 BackgroundWorker를 실행하며 진행 표시 줄을 업데이트 내 프로세스에 비동기 실행 : 내 코드의

Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) 
      Dim worker As BackgroundWorker = CType(sender, BackgroundWorker) 
      While finished = False 
       Threading.Thread.Sleep(50) 
       bw.ReportProgress(currPercent) 
      End While 
     End Sub 

시작은 간단했다 -과 같이 :

Private Sub buttonStart_Click(sender As Object, e As RoutedEventArgs) Handles btnStart.Click 
      bw.RunWorkerAsync() 
      beginUpdate() 
     End Sub 

답변

1

중요한 것부터 먼저. .. ProgressBar 작동 :이 부분에 대해서는 Progress Bar update from Background worker stalling 질문에 대한 내 대답을 읽어보십시오. 스택 오버플로 관련 질문. 자, 이제 ProgressBar 기본 업데이트를 가지고 있다고 가정하고 ... 다음으로 작업을 취소 할 수 있기를 원합니다.

private void DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 0; i <= 100; i++) 
    { 
     if (IsCancelled) break; // cancellation check 
     Thread.Sleep(100); // long running process 
     backgroundWorker.ReportProgress(i); 
    } 
} 

그래서 당신은 장기 실행 프로세스와 ProgressBar 업데이 트를 취소 할 필요가 trueIsCancelled 속성을 설정하는 것입니다 : 그에 따라 DowWork 방법을 업데이트하는 간단한 문제입니다.

+0

안녕하세요, 귀하의 회신과 귀하의 링크에 감사 드리며, 저를 도왔습니다.전역 변수에 백분율을 적용하고 코드 시작시 배경 작업자를 실행했습니다. DoWork 메서드는 내 게시물의 맨 아래에서 편집됩니다. 꽤 간단했지만 효과적이었습니다! 다시 올바른 방향으로 나를 가리켜 주셔서 감사합니다. – JumpingRock

+0

당신을 진심으로 환영합니다. 언제나처럼 ... 비트 단위로 개발하면 복잡한 상황을 단순화합니다. – Sheridan

관련 문제