ワーカースレッドを使用してパス文字列から.png画像をグローバルPictureBox2オブジェクトにロードし、_RunWorkerCompletedを終了して、Picturebox2の幅と高さをprocesspic2というメソッドで追加作業に使用します。 5番または6番くらいの画像がPBに追加されるまで、すべてがうまく動作します。この点、processpic2メソッドでは、PictureBox2のimageプロパティが何も評価されないため、例外がスローされます。PictureBoxは画像の追加を停止します
なぜPBがしばらくして画像を撮影しなくなるのですか?
Public Class Form1
Public WithEvents BackgroundWorker1 As New System.ComponentModel.BackgroundWorker
Private Sub BackGroundworker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim args As ArgumentType = e.Argument
PictureBox2.Image = Nothing
PictureBox2.Invalidate()
Dim img As Image
Using str As Stream = File.OpenRead(args._pathstr)
img = Image.FromStream(str)
End Using
PictureBox2.Image = img
e.Result = "done"
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) _Handles BackgroundWorker1.RunWorkerCompleted
'Called when the BackgroundWorker is completed.
processpic2()
End Sub
Sub btnLoadPicture(pathstr)
Dim args As ArgumentType = New ArgumentType()
args._pathstr = pathstr
BackgroundWorker1.RunWorkerAsync(args)
End Sub
Sub processpic2()
If PictureBox2.Image Is Nothing Then MsgBox("Image is Nothing")
End Sub
が理由です、バックグラウンドワーカーからのUIエレメントを処理しないでください。 ...デリゲートを使用して呼び出します。ピクチャボックスは、バックグラウンドワーカーとは別のスレッドにあります。 – Codexer
なぜ私はこれにコメントする必要があるとは思わないのですか?あなたが正しい方向にあなたを得ることに取り組んでいるUIコントロールの呼び出しを見てください。まだ助けが必要な場合は、あなたの質問を更新してください。私たちはあなたを助けてくれることをうれしく思います。 – Codexer
私はザグラーと同意します。ロードされたイメージを 'RunWorkerCompletedEventArgs'(つまり' e.Result')に返し、RunWorkerCompletedに 'PictureBox.Image'を設定することができます。 – SSS