-1

前述のように、DoHeavyWork()というサブ関数を実行するBackgroundWorkerがあります。このサブ機能DoHeavyWork()の内部BackgroundWorkerが他のフォームでGUIを更新しない

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 
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 

、他の形態の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 
関連する問題