1

「メイン」と「パネル」の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" にあると思います。

4

1 に答える 1

0

バックグラウンドワーカーを理解しているので、バックグラウンドワーカースレッド内からUIまたはそのコントロールを参照できないため、 me.cosntrolls ステートメントが何らかの形で間違っているという考えはおそらく正しいでしょう。

于 2013-02-17T23:52:13.520 に答える