Probleme mit Threads in Windows.Forms – brauche Hilfe



  • Hallo

    Ich habe eine PictureBox (PB), in welche ich etwas zeichnen möchte. Dafür habe ich mir das paint-Ereignis der PB überschrieben. Die PB ist an allen 4 Seiten an die Form gedockt, so dass die PB gleichmäßig mit der Größe der Form beim „resizen“ der Form geändert wird. Klar oder? Außerdem habe ich das Resize event der Form überschrieben, dort werden Skalierungsfaktoren berechnet, welche im OnPaint der Form für die Skalierungstransformation benutzt werden. Und hier liegt auch das Problem! Denn wenn ich das Fenster maximiere (Maximieren Knopf rechts oben) wird eine Exception geworfen („Das Objekt wird zur Zeit anderswo verwendet“). Aber wenn ich unten rechts anklicke und skaliere wird meist keine Exception geworfen. Somit liegt die Vermutung nahe, dass das maximieren so schnell abläuft, dass währenddessen die Skalierungsfaktoren berechnet (geschrieben) werden, das Paint diese schon wieder lesen möchte.
    Wie kann man das denn verhindern, bzw. das Paint event so lang blockieren, bis die Variablen zu Ende geschrieben wurden? Mit lock(this) { /*hier die Berechnung*/ } wird gar nichts mehr gezeichnet und das Programm hängt sich total auf. Die Exception kann man auch nicht abfangen, bzw. endet diese in der main Methode.
    Dies ist auch 100% die Fehlerursache, denn wenn ich den Funktionsaufruf (calcFactors()) raus kommentiere, stürzt nichts ab!

    Hier der Code:

    private void PB_Paint(object sender, System.Windows.Forms.PaintEventArgs pea)
    {
        try
        {
            pea.Graphics.ScaleTransform(sx, -sy);
    		// ...
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }           
    }
    
    private void GUI_Resize(object sender, System.EventArgs ev)
    {
        try
        {
    calcFactors();
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }   
    }
    
    private void calcFactors()
    {
        try
        {
            sx = (float)PB.Width / xMax;
            sy = (float)PB.Height / yMax;
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }  
    }
    


  • Das ist ja interessant ich kämpfe nämlich im Moment mit genau dem gleichen Problem. Zwar sind die Umstände ein bischen anders, läuft aber aufs gleiche raus und ich bekomme die gleiche Fehlermeldung, die in der Main-Funktion endet. Ich bin leider auch noch nicht dahinter gekommen wie man den Fehler vermeiden oder abfangen kann, hoffe aber dass jemand eine Lösung für das Problem hat.



  • hi,

    schon mal versucht, die variablen einzeln zu sync´en?

    etwa so:

    private void PB_Paint(object sender, System.Windows.Forms.PaintEventArgs pea)
    {
        try
        {
            lock(sx)
            {
                lock(sy)
                {
                    pea.Graphics.ScaleTransform(sx, -sy);
                }
            }
            // ...
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }           
    }
    
    // ...
    
    private void calcFactors()
    {
        try
        {
            lock(sx)
            {
                lock(sy)
                {
    
                    sx = (float)PB.Width / xMax;
                    sy = (float)PB.Height / yMax;
                }
            }
        }
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }  
    }
    

    grüsse



  • Ich hab das Problem inzeischenlösen können, indem ich die scaleTrasnform nicht mehr nutze. Die hat irgendwelche Probleme gemacht. ???? 😕

    Trotzdem Danke!!! Ist natürlich soweiso besser einzelne Varis zu locken anstatt gleich das ganze Objekt. Danke für den Tipp!


Anmelden zum Antworten