2014-06-17 55 views
0

所以我的問題可能聽起來很熟悉,我只是想與我的程序中正在處理的數據同時更新進度條。更新進度條WPF Visual Studio

我有兩個窗口: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. 使用調用/調度員/代表,試圖似乎只能夠把更新在不同的線程的排隊?似乎無法暫停其他線程更新用戶界面要麼...
  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 

每次我點擊更新/取消按鈕,進度條都會更新。每次我按下按鈕時,都會刷新進度條到當前的完成狀態。我很困惑,我能夠更新用戶界面,如果它只是一個窗口......但如果用戶按下一個按鈕來調用一個新窗口,我不能在第二個窗口中更新任何東西。有什麼建議麼?

編輯: 我最終使我的長代碼更新的全局變量。第一

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

回答

1

第一件事: - :比跑的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 

代碼的我開始很簡單。 ..得到ProgressBar工作:對於這個部分,請閱讀我對Stack Overflow的Progress Bar update from Background worker stalling問題的回答。現在,我們假設您已經基本更新了ProgressBar正在工作......接下來,您希望能夠取消該工作。這是一個簡單的事情來更新相應的DowWork方法:

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更新到IsCancelled屬性設置爲true

+0

嘿感謝您的回覆和您的鏈接,它幫助我。我將一個百分比作爲全局變量,並在我的代碼開始處運行backgroundworker,DoWork方法在我的帖子底部進行編輯。 這很簡單,但它的工作!再次感謝您指引我朝着正確的方向發展。 – JumpingRock

+0

不客氣。一如既往......逐步發展簡化了複雜的情況。 – Sheridan