2016-11-15 14 views
0

ワーカースレッドを使用してパス文字列から.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 
+1

が理由です、バックグラウンドワーカーからのUIエレメントを処理しないでください。 ...デリゲートを使用して呼び出します。ピクチャボックスは、バックグラウンドワーカーとは別のスレッドにあります。 – Codexer

+0

なぜ私はこれにコメントする必要があるとは思わないのですか?あなたが正しい方向にあなたを得ることに取り組んでいるUIコントロールの呼び出しを見てください。まだ助けが必要な場合は、あなたの質問を更新してください。私たちはあなたを助けてくれることをうれしく思います。 – Codexer

+1

私はザグラーと同意します。ロードされたイメージを 'RunWorkerCompletedEventArgs'(つまり' e.Result')に返し、RunWorkerCompletedに 'PictureBox.Image'を設定することができます。 – SSS

答えて

1

BackgroundWorkerの全文はバックグラウンド作業です。 UIに変更を加えることは、バックグラウンド作業の正反対です。それは前景の仕事です。あなたの仕事がPictureBoxの現在の内容を消去し、ファイルから画像をロードしてからその画像を表示するのであれば、中間ステップはバックグラウンド作業のみなので、DoWorkイベントハンドラで中間ステップを実行する必要があります。最初の手順はRunWorkerAsyncに電話する前に実行し、最後の手順はRunWorkerCompletedイベントハンドラで行う必要があります。

この場合、なぜこの場合はBackgroundWorkerを使用するのですか? PictureBoxLoadAsyncメソッドを呼び出してみませんか?

+0

ありがとうございました - 'PictureBox'のための' LoadAsync'メソッドを知らなかったので、それを調べます。一つのことは確かですが、画像は約600×400ピクセルの.pngで、 'PictureBox1.Image = Nothing'を設定してもPictureボックスは約5-8画像をロードして表示した後にハングする傾向があります。いくつかのメモリの内容がいっぱいになっているようです。 'PictureBox1.Invalidate'と' PictureBox1.Image = Nothing'はこの特殊性を根絶するものではありません。 – wrtsvkrfm

+0

'Image'は使い捨てオブジェクトです。 'Image'オブジェクトを作成してそれを' PictureBox'の 'Image'プロパティに割り当てる場合、' Image'オブジェクトで 'Dispose'を呼び出す必要があります。 – jmcilhinney

0

SOLUTION - の提案のおかげで受け取った、と私はPictureBoxLoadAsync方法次のコードについてはMSDNで発見しても問題が解決:

PictureBox2.Image = Nothing 

PictureBox2.WaitOnLoad = False 

' Load the image asynchronously. 
PictureBox2.LoadAsync(pathstr) 
関連する問題