2017-01-10 13 views
0

Der folgende Code auf der Gruppe jedes PictureBox_right und PictureBox_left gibt mir einen Fehler, dass das Objekt an anderer Stelle verwendet wird. Ich habe mich gefragt, wie ich das beheben kann.Wie man threading Fehler behebt

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(); 
      } 
     } 
    } 

Im Folgenden sind die Codezeilen, die den Fehler verursachen:

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; 

Dies ist ein weiterer Teil ist, dass Fehler, es ist im Wesentlichen das gleiche, aber tut es für das linke Bildfeld.

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; 

Meine Frage ist, wie kann ich das beheben. Was ich denke ist, dass in bestimmten Fällen auf mein BildBox_rightconnectivity.Image und auf imageBox_leftconnectivity.Image immer noch von einem anderen Thread zugegriffen wird. Wo ein anderer Thread hereinkommt und dann versucht, das Bild zu setzen. Ich habe mich gefragt, wie ich das beheben könnte? Wie Sie sehen können, war mein erster Versuch, das Bild im Bitmap-Kopierobjekt zu kopieren. und verwenden Sie das dann, um die PictureBox_left und PictureBox_right festzulegen. Aber ich habe festgestellt, dass das Objekt an anderer Stelle fehlerhaft ist.

Antwort

0

Es gibt mindestens ein paar Probleme mit Ihrem Code.

Erstens ist es nicht erlaubt, auf Steuerelemente (wie PictureBox) von einem anderen Thread als dem Thread zuzugreifen, auf dem sie erstellt wurden (hoffentlich der GUI-Thread). Das Abrufen/Setzen von pictureBox_rightConnectivity.Image aus mehreren Threads ist also illegal, selbst wenn Sie Sperren verwenden.

Außerdem funktioniert das Sperren nicht, wenn Sie nicht jedes Mal dasselbe Objekt sperren. In Ihrem ersten Codeblock sperren Sie lockObject. Im zweiten Codeblock sperren Sie ArduinoUno_v1.Properties.Resources.on_button. Sind diese das gleiche Objekt? Wenn nicht, erhalten Sie nicht den "sich gegenseitig ausschließenden" Effekt, weil es nichts gibt, was einen Thread daran hindert, die Sperre auf lockObject zu erhalten, während ein anderer die Sperre auf ArduinoUno_v1.Properties.Resources.on_button hält.

Das sind nur ein paar Dinge, die ich sofort sehe. Es gibt wahrscheinlich andere Threading-Fehler. Im Allgemeinen sollten Sie Threading nur ausführen, wenn Sie sicher sind (basierend auf sorgfältigen Studien), dass Sie wissen, was Sie tun, denn wenn Sie sich unsicher sind, haben Sie wahrscheinlich Bugs, und das sind oft Bugs sind schwer zu reproduzieren und aufzuspüren.

Verwandte Themen