-1

DoHeavyWork() 하위 함수를 실행하는 BackgroundWorker가 있습니다. 이 하위 기능 DoHeavyWork() 내부 BackgroundWorker가 다른 폼에서 GUI를 업데이트하지 않습니다.

Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged 
     ProgressBar1.Value = e.ProgressPercentage 
     Label8.Text = e.ProgressPercentage.ToString() + " %" 
    End Sub 


Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 

     If e.Cancelled = True Then 
      ProgressBar1.Value = 0 
      Label8.Text = "" 
     ElseIf e.Error IsNot Nothing Then 
      MessageBox.Show(e.Error.Message) 
     Else 
      MessageBox.Show("Completed!") 
     End If 
    End Sub 

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
     If BackgroundWorker1.CancellationPending = True Then 
      e.Cancel = True 
     Else 
      'DO HEAVY WORK 
      DoHeavyWork() 
     End If 
    End Sub 

, 또 다른 형태의 GUI를 업데이트하는 코드가있다.

Private Sub DoHeavyWork() 
For i As Integer = 1 To fresult_counter 
    Dim fresult As New Button 
       fresult.Name = "fresult_" & i 
       fresult.Text = result(index_acc(i - 1)).ToString 

       fresult.TextAlign = ContentAlignment.MiddleLeft 
       fresult.Width = 265 
       fresult.AutoSize = True 
       fresult.BackColor = Color.White 

       With fresult.FlatAppearance 
        .BorderColor = Color.White 
        .BorderSize = 2 
        .MouseDownBackColor = Color.DeepSkyBlue 
        .MouseOverBackColor = Color.DeepSkyBlue 
       End With 
       fresult.Anchor = AnchorStyles.Left 
       fresult.FlatStyle = FlatStyle.Flat 
       fresult.UseVisualStyleBackColor = False 
       fresult.Location = New Point(0, 22 * (i - 1)) 
       Form1.TabControl2.TabPages(1).Controls.Add(fresult) 
       BackgroundWorker1.ReportProgress(i) 
Next 
End Sub 

문제는 진행률 표시 줄이 작동하는 GUI 만 업데이트되지 않은 것입니다. BackgroundWorker 밖으로 코드 집합을 얻으려고했는데 제대로 작동합니다. BackgroundWorker가 GUI를 업데이트 할 수 있도록 설정하지 않은 것이 있습니까?

+0

다른 스레드에 있기 때문입니다. 진행률 표시 줄은 UI 스레드에 없기 때문에 작동합니다. 다른 참가자는 아마도 ... 대리인을 살펴보고 호출하면 필요한 것을 찾을 수 있습니다. 또한 문제의 주요 코드를 남겨 두는 것은 아마도 DoHeavyWork에있는 것입니다. 아마도 컨트롤을 변경하려고하는 것일 수도 있습니다. – Codexer

+0

조언을 주셔서 감사합니다. – jwen

+0

'BackgroundWorker'사용에 대한 연구는 거의하지 않은 것 같습니다. 요점은 배경 작업을하는 것입니다. UI와 관련이있는 것은 배경 작업과 정반대입니다. 귀하의 경우, 당신이하고있는 모든 일은 UI를 포함하므로, 우리는'BackgroundWorker '를 전혀 사용할 수 없습니다. – jmcilhinney

답변

0

jmcilhinney으로 언급했듯이 해결책은 매우 간단합니다.

BackgroundWorker가 백그라운드에서 진행률 표시 줄을 업데이트하게하십시오. 작업이 끝나면 진행률 막대가 100으로 표시되면 완료됩니다. 이 완료되면

, 단순히 업데이트 GUI의 코딩을 추가 (내 경우에는 'Form1.TabControl2.TabPages (1) .Controls.Add (fresult)') BackgroundWorker에이 완료된 하위 기능에서 :

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted 

     If e.Cancelled = True Then 
      ProgressBar1.Value = 0 
      Label8.Text = "" 
     ElseIf e.Error IsNot Nothing Then 
      MessageBox.Show(e.Error.Message) 
     Else 
      MessageBox.Show("Completed!") 
      Form1.TabControl2.TabPages(1).Controls.Add(fresult) 
     End If 
    End Sub