2016-05-23 9 views
2

利用可能な画像のリストから画像を選択し、対応する画像をPictureBoxに表示できるwinformsアプリケーションがあります。画像は非常に巨大で、最低10MBです。これにより、画像が読み込まれている間は、UIの残りの部分が反応しなくなります。画像がスムーズにロードし、UIもアクセスすることができ、この後PictureBoxに割り当てられたErrorImageが間違って表示されない

private void SetViewerImage() 
{ 
    if (pictureBox1.Image != null) 
     pictureBox1.Image.Dispose(); 
    pictureBox1.Image = new Bitmap(/*Some stream*/); 
} 

private void LoadImage() 
{ 
    // loadViewerThread is a Thread object 
    if (loadViewerThread != null && loadViewerThread.IsAlive) 
    { 
     loadViewerThread.Abort(); // Aborting the previous thread if the user has selected another image 
    } 
    loadViewerThread = new Thread(SetViewerImage); 
    loadViewerThread.Start(); 
} 

SetViewerImage機能は以下の通りである:だから、私は、次のコードを使用して、別のスレッド上に画像をロードすると考え。 しかし、ユーザーが一連の画像の間を非常に高速に動くと、大きな赤いXマークが表示されます。これは、Disposeの呼び出しがSetViewerImageにあるために発生します。

私はPictureBoxにErrorImageを割り当てましたが、この場合はErrorImageが表示されません。

質問:

  1. は私のスレッド実装に何か問題はありますか? イメージが廃棄されるのはなぜですか?
  2. 私は別のErrorImageを表示でき、 赤いXを表示できない方法はありますか?
+0

を処分するための最も安全な方法を'pb.Image'はこれです:' if(...){Image temp = pictureBox1.Image; pictureBox1.Image = null; temp.Dispose(); } 'それが役立つかどうかは分かりませんが、それは最初のステップです。 - また、あなたは' InitialImage'プロパティに気付きましたか? - 最後に、イメージの読み込みが完了するまでリストを無効にすることを検討してください。 – TaW

+0

Imageプロパティをnullに設定すると、ピクチャボックスは空白になり、カスタムErrorImageは表示されません。私は画像のリストを無効にすることはできません。私の場合、ユーザーは画像間を移動することが許されるべきです。 –

+0

_ Imageプロパティをnullに設定すると、ピクチャボックスは空白になり、カスタムErrorImageは表示されません._もちろん、なぜでしょうか? Nullはエラーではなく、空のPBだけです。リストを無効にしたくない場合でも、ImageLoadedイベントに達するまで、新しいイメージが選択されたときに実行中のスレッドを無効にしたり、中止したりしようとします。 – TaW

答えて

0

UIスレッドのコントロールを操作する必要があります。これは、別のスレッドのControl.Invoke()を使用して行うことができます。

大きなボトルネックは、ストリームからイメージを作成しているので、あなたは、UIスレッドが解放維持するために、このようなあなたの方法を再編成することができる必要があります:一般的な合意によって

private void SetViewerImage() 
{ 
    Bitmap image = new Bitmap(/* Some stream*/); 

    pictureBox1.Invoke(new Action(() => 
     { 
      if (pictureBox1.Image != null) 
      { 
       pictureBox1.Image.Dispose(); 
       pictureBox1.Image = null; // This might help? Only add if it does. 
      } 
      pictureBox1.Image = image; 
     })); 
} 
+0

@itseme質問をあまり複雑にしたくないので、Invokeへの呼び出しを投稿しませんでした。私はdiffスレッド上で操作をしているので、私はそれを使用しました。 Imageをnullに設定するようあなたの提案を試みました。赤いXは表示されませんでしたが、ピクチャボックスは空白でした。カスタムErrorImageが表示されませんでした –

関連する問題