前述のように、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を更新できるように設定していないものはありますか?
これらは異なるスレッドにあるためです。プログレスバーはUIスレッドにはないので動作しますが、他にはおそらく...デリゲートを見て起動すると、必要なものが見つかります。問題のメインコードを残しておけば、おそらくコントロールを変更しようとしているので、DoHeavyWorkに何が入っていますか? – Codexer
アドバイスありがとうございました。 – jwen
あなたは明らかに 'BackgroundWorker'の使用に関する研究はほとんど行っていません。全体のポイントは、背景の仕事をすることです。 UIに関係することは、バックグラウンド作業とまったく逆です。あなたの場合、あなたがやっていることすべてがUIを含んでいるので、あなたは 'BackgroundWorker'を全く使用できません。 – jmcilhinney