2017-01-10 8 views
0

各pictureBox_rightとpictureBox_leftのセットの次のコードは、オブジェクトが別の場所で使用されているというエラーを表示しています。私はこれをどのように修正するのだろうと思っていた。スレッディングバグを修正する方法

private Bitmap pictureBox_right 
    { 
     get 
     { 
      lock (lockObject) 
       return (Bitmap)this.pictureBox_rightConnectivity.Image.DeepClone(); 
     } 
     set 
     { 
      lock (lockObject) 
      { 
       pictureBox_rightConnectivity.Image = value.DeepClone(); 
      } 
     } 
    } 
    private Bitmap pictureBox_left 
    { 
     get 
     { 
      lock (lockObject) 
       return (Bitmap)this.pictureBox_leftConnectivity.Image.DeepClone(); 
     } 
     set 
     { 
      lock (lockObject) 
      { 
       this.pictureBox_leftConnectivity.Image = value.DeepClone(); 
      } 
     } 
    } 

次のエラーが原因となるコードの行です:これはエラーが、それは本質的には同じですが、左のピクチャボックスのためにそれをしない別の部分である

Bitmap copy; 
       lock (ArduinoUno_v1.Properties.Resources.on_button) 
       { 
        copy = new Bitmap(ArduinoUno_v1.Properties.Resources.on_button); 
        pictureBox_rightConnectivity.Image = new Bitmap(ArduinoUno_v1.Properties.Resources.on_button); 
        //pictureBox_right = ArduinoUno_v1.Properties.Resources.on_button; 

       } 

        pictureBox_right = copy; 

Bitmap copy; 
      lock (ArduinoUno_v1.Properties.Resources.on_button) 
      { 
       copy = new Bitmap(ArduinoUno_v1.Properties.Resources.on_button); 
       pictureBox_leftConnectivity.Image = new Bitmap(ArduinoUno_v1.Properties.Resources.on_button); // making a copy so we don't get into access problems 
       // pictureBox_left = ArduinoUno_v1.Properties.Resources.on_button; 

      } 

       pictureBox_left = copy; 

私はこれをどのように修正するのですか。私の考えていることは、特定の機会に、私のpictureBox_rightconnectivity.ImageとpictureBox_leftconnectivity.Imageがまだ別のスレッドによってアクセスされているということです。別のスレッドが入ってきて、そのイメージを設定しようとします。私はこれをどのように修正するのだろうと思っていたのですか?私の最初の試みは、ビットマップコピーオブジェクトでイメージをコピーしようとすることでした。それを使ってpictureBox_leftとpictureBox_rightを設定します。しかし、私はこれがまだオブジェクトが他のエラーで使用されていることが判明した。

答えて

0

コードには少なくとも2つの問題があります。

まず、作成されたスレッド(うまくいけばGUIスレッド)以外のスレッドからコントロール(PictureBoxなど)にアクセスすることはできません。ロックを使用していても、複数のスレッドからpictureBox_rightConnectivity.Imageを取得/設定することは不正です。

また、毎回同じオブジェクトをロックしない限り、ロックはうまくいっていません。最初のコードブロックでは、lockObjectにロックしています。 2番目のコードブロックでは、ArduinoUno_v1.Properties.Resources.on_buttonにロックしています。これらは同じオブジェクトですか?そうでない場合は、一方のスレッドがにロックを保持している間に、一方のスレッドがlockObjectにロックを取得することはないため、「相互に排他的」な効果は得られません。

これは私がすぐに見ることのほんの一部です。多分、他のスレッドのバグがあります。一般的に、スレッディングは、あなたがしていることを知っていることを確信している場合にのみ行うべきことです。なぜなら、あなたが不明な点があれば、おそらくバグがあります。再現や追跡が難しい。

関連する問題