「メイン」と「パネル」の2つのフォームがあります。
メイン フォームには、「bt_panel1」と「bt_panel2」の 2 つのボタンがあります。
各ボタンの機能は次のとおりです。
Private Sub bt_panel1_Click(sender As System.Object, e As System.EventArgs) Handles bt_panel1.Click
Dim panel1_run As New panel
panel1_run.PANEL_NUM = 1
panel1_run.Name = "panel1_run"
panel1_run.Text = "PANEL 1"
panel1_run.Show()
End Sub
(bt_panel2については「1」ではなく「2」)
パネル フォームには以下が含まれます。
- 関数負荷:
Private Sub panel_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
[...]
'create 80 picturboxes
For i = 1 To 4
For k = 1 To 20
Dim picture As New PictureBox
picture.Name = "pic" & i & "c" & k
[...]
Controls.Add(picture)
AddHandler picture.Paint, AddressOf paintchar
Next
Next
'start BackgroundWorker
BackgroundWorker1.RunWorkerAsync()
End Sub
- バックグラウンド ワーカー コントロール (無関係なことを行います) とその「RunWorkerCompleted」:
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Dim temp As PictureBox
Try
For i = 1 To 4
For k = 1 To 20
'for each picturebox call refresh (paintchar)
temp = Me.Controls.Item("pic" & i & "c" & k)
temp.Refresh()
Next
Next
'restart BackgroundWorker1 continuosly
BackgroundWorker1.RunWorkerAsync()
Catch ex As Exception
MsgBox("Error BackgroundWorker1_RunWorkerCompleted" & vbCrLf & ex.Message)
End Try
End Sub
- 関数ペイント:
Private Sub paintchar(sender As System.Object, e As System.Windows.Forms.PaintEventArgs)
[...]
Try
e.Graphics.FillEllipse(Brushes.LawnGreen, New RectangleF(loc, size))
Catch ex As Exception
MsgBox("Error paintchar" & vbCrLf & ex.Message)
End Try
End Sub
パネルを 1 つだけ開いた場合 (Main で bt_panel1 または bt_panel2 を押す)、すべて問題ありません。
しかし、両方のパネルを開く (メインで bt_panel1 と bt_panel2 を押す) と、アプリケーションは応答せず、panel2 は完全に空白 (ペイントされていません) になります。
アプリケーションが応答しません (パネルを閉じることができず、メインを閉じることもできません...閉じるにはデバッグを終了する必要があります)。
例外は呼び出されません。
ReportProgress 関数は使用されません。
DoWork 関数は、SharedMemory 領域から一部のデータを読み取ります (panel1 と 2 の異なるデータ)
問題は、フォームの対応するインスタンスを参照していない RunWorkerCompleted の "Me.Controls" にあると思います。