2012-06-07 3 views
1

Я надеялся на некоторую помощь с моим фоном, поскольку я просто не могу заставить его работать. В основном у меня есть рабочий стол, который выполняет несколько задач, но я пытаюсь реализовать индикатор выполнения и метку. Я собираюсь установить максимальное значение индикатора выполнения на 10, а затем обновить его, когда я перемещаюсь с каждой задачей, также я думаю о метке с индикатором выполнения, который отображает ход, т. Е.Индикатор прогресса с фоном рабочего

Pb value = 2 
20% completed 

Pb value = 6 
60% completed 

и так далее.

До сих пор у меня это было для кодирования.

Обновление * Спасибо lars за вашу помощь.

Так что, просто быстрый вопрос: будет ли подобное событие работать так?

Private Sub BGWorker_DoWork(ByVal sender As Object, _ 
          ByVal e As DoWorkEventArgs) _ 
          Handles BGWorker.DoWork 
    For i as Integer = 1 to 2 
    'My task code 1 
    BGWorker.ReportProgress(i) 
    Next 

For i as Integer = 3 to 4 
    'My task code 2 
    BGWorker.ReportProgress(i) 
    Next 

For i as Integer = 5 to 6 
    'My task code 3 
    BGWorker.ReportProgress(i) 
    Next 

For i as Integer = 7 to 8 
    'My task code 4 
    BGWorker.ReportProgress(i) 
    Next 

For i as Integer = 9 to 10 
    'My task code 5 
    BGWorker.ReportProgress(i) 
    Next 
End Sub 

ответ

5

Вместо того, чтобы пытаться установить значение прогресс бар в DoWork (который не работает в потоке пользовательского интерфейса), вы должны иметь «отчет» BackgroundWorker это прогресс:

Private Sub BGWorker_DoWork(ByVal sender As Object, _ 
          ByVal e As DoWorkEventArgs) _ 
          Handles BGWorker.DoWork 
    For i as Integer = 1 to 10 
    BGWorker.ReportProgress(i) 
    Next 
End Sub 

Затем в ProgressChanged случае, вы можете установить значение полосы прогресс:

Private Sub BGWorker_ProgressChanged(ByVal sender As Object, _ 
            ByVal e As ProgressChangedEventArgs) _ 
            Handles BGWorker.ProgressChanged 
    Me.Pb1.Value = e.ProgressPercentage 
End Sub 
+0

Ларс вы можете увидеть мой ответ? – JackSparrow

+0

@JackSparrow Я посмотрел ваш код, и да, это сработает. Предполагая, что эти «задачи» занимают более 50 мс. Событие 'ProgressChanged' - это место, где вы обновляете свой графический интерфейс, поэтому индикатор выполнения обновляется там. Также вы можете обновить свой ярлык: 'Me.Label1.Text = String.Format (" {0}% ", e.ProgressPercentage * 10)'. Используйте событие «RunWorkerCompleted», чтобы вернуть все значение 0 и сбросить метку до «Завершено» или что-то в этом роде. – LarsTech

+0

Привет, Ларс, извините, я думал, что Me.Label1.Text = String.Format ("{0}%", e.ProgressPercentage * 10) войдет в событие Do Work под BGWorker.ReportProgress (i) и NOT в прогресс изменился? – JackSparrow

4

У вас есть несколько проблем:

  1. Ваш код не будет компилироваться.
  2. Вы не создаете BackgroundWorker в любом месте.
  3. Вы не назначили обработчик события ProgressChanged.
  4. Вы не обрабатываете никаких событий вообще.

Вы должны сделать все это, чтобы использовать BackgroundWorker. Хороший начинающий учебник по http://msdn.microsoft.com/en-us/library/cc221403%28v=vs.95%29.aspx

+0

вы не * нужно * в 'обработчик ProgressChanged', если вы пытаетесь на самом деле сообщать о прогрессе. –

+0

Возможно, добавьте примечание, которое разъясняет: ... для * отчета о прогрессе * от ..., а не ... до * использования * a ... –

+0

@ Kendal, если вы внимательно прочитали вопрос, вы можете заметить, что он конкретно заявил , несколько раз, что он действительно хотел сообщить о прогрессе. –