Thread: Das Objekt wird bereits an anderer Stelle verwendet

Halfbax

Erfahrenes Mitglied
Guten Abend,

seitdem ich einen Speicherleak behoben habe. Steht die Funktionalität meines Programms auf der Kippe. Ich bin gerade dabei einen Mandelbrot Generator zu erstellen und nutze dafür Threads.

Das Problem tritt nun auf, wenn das MouseMove Event getriggert wird, denn dann wird der jeweilige Thread mehrmals aufgerufen, wobei der alte Thread noch nicht beendet ist. Selbst ein Thread.Abort() hilft mir nicht. Desweiteren wird mein Viereck nicht mehr richtig gezeichnet.

System.InvalidOperationException: "Das Objekt wird bereits an anderer Stelle verwendet."

FractalWindow.cs
C#:
        private void imagePanel_MouseMove(object sender, MouseEventArgs e)
        {
            if(e.Button == MouseButtons.Left)
            {
                renderThread.Abort();
                renderThread = new Thread(delegate () {
                    fractalHandler.RenderMouseEvent(new Point(e.X, e.Y), pStart);
                });

                renderThread.Start();

                imagePanel.BackgroundImage = (Image) fractalHandler.getDataSource();
            }
        }

C#:
public void RenderMouseEvent(Point e, Point pStart)
        {
            if (datasource != null)
            {
                datasource = Fractal.generateRectangleOnBitmap(datasource, panelWidth, panelHeight, e, pStart);
            }
        }

C#:
        public static Bitmap generateRectangleOnBitmap(Bitmap datasource, int panelWidth, int panelHeight, Point e, Point pStart)
        {
            Point temp = new Point(e.X, pStart.Y + ((int)(((panelHeight - 28) / (panelHeight * 1.0)) * (e.X - pStart.X))));
            Rectangle rect = Rectangle.FromLTRB(pStart.X, pStart.Y, temp.X, temp.Y);
            Bitmap bitmap = new Bitmap(panelWidth, panelHeight);

            Graphics g = Graphics.FromImage((Image) bitmap);

            g.DrawImage((Image) datasource, 0, 0); // FEHLER
            g.DrawRectangle(new Pen(Brushes.Red, 3), rect);

            return bitmap;
        }

Ich habe bereits versucht das Objekt zu locken, aber vergeblich.

Vielleicht könnt Ihr mir ja helfen.

LG
Leon
 
Hi

welches Objekt und wo?

Jedenfalls, diese ganzen GUI-Sachen (auch wenn sie auf Images verwendet werden) sind innen nicht threadsafe. Siehe die Invoke-Sache hier https://msdn.microsoft.com/en-us/library/ms171728(v=vs.110).aspx (oder strukturier das Programm um, dass der Grafikteil nur in einem Thread passiert. Mit dem Invoke ist sonst nicht sicher, ob von der Verschnellerung durch Threads etwas übrig bleibt. Könnte sogar noch langsamer werden). Eine Fehermeldung ist noch nett (und nicht garantiert), schlimmer ist einfach komplettes Fehlverhalten.

Und wenn man Thread.Abort braucht ist was falsch, und nicht nur an der "Schönheit" vom Code. Auch da: Wenn das in deinem Programm nötig ist, besser gleich umstrukturieren.
 
Hallo sheel,

Dritter Code-Teil Zeile 9 befindet sich der Thread übergreifende Fehler. Also muss das Bearbeiten des Bildes definitv im GUI Thread bleiben?

LG
 
ich vermute mal datasource kommt ausm UI Thread (das bei RenderMouseEvent)
und mehrere Threads versuchen auf das gleiche objekt zuzugreifen,
eventuell mit lock etc. dies unter binden und/oder eine neue eigene Kopie des dataSoruce an den Thread weitergeben.

und vorallem dein dataSource ist ein Image und er zeichnet sich immer selbst in ein neues Bitmap rein,
wird zurückgegeben und ist das neue dataSource das sich selbst wieder in ein bitmap zeichnet ???
 
RednerMouseEvent ist ein Methode aus der Klasse FractalHandler, diese Methode/Klasse wird im UI Thread gecalled. Dabei wird ein neuer Thread erstellt und die Daten als Delegate übergeben.

FractalHandler bleibt im UI Thread bestehen.
 
delegates sind ja nixs andere wie zeiger auf die aufzurufenden Methoden,
die referenz Objekte die übergeben werden bleiben ja die gleichen, eventuell diese locken das nicht mehrerer gleichzeitige Threads drauf zu greifen.
wie gesagt dein datasource scheint mir nicht threadsafe, und hast ja da auch selber da FEHLER geschrieben
 

Neue Beiträge

Zurück