Laden...

Bitmaps "Das Objekt wird bereits an einer anderen Stelle verwendet" Problem

Erstellt von Madome31 vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.031 Views
M
Madome31 Themenstarter:in
8 Beiträge seit 2014
vor 10 Jahren
Bitmaps "Das Objekt wird bereits an einer anderen Stelle verwendet" Problem

Hallo Community,

ich bin noch ein C#-Neuling und habe ein Problem. Ichwürde gerne zwei Bilder miteinander vergleichen (das eine ist soll das erste Bild von der Webcam sein und das ander das aktuelle) und diese Pixel für Pixel durchgehen. Ansich ja kein Problem. Wenn ich das Programm jetzt aber starten möchte, gibt mit VS aus:

Fehlermeldung:
Das Objekt wird bereits an einer anderen Stelle verwendet.


//Soll die Bilder vergleichen
private void comparePictures()
        {
            int height = startImage.Height;
            int widht = startImage.Width;
            int amountOfPixels = height * widht;
            int different = 0;

            for (int h = 0; h < height; h++)
            {
                for(int w = 0; w < widht; w++)
                {
                    if (startImage.GetPixel(w, h).ToString() != actuallImage.GetPixel(w, h).ToString())// Das Objekt wird bereits an einer anderen Stelle verwendet.
                        different++;
                    
                }
                
            }

            if (different > 0.1F * amountOfPixels)
                differentFound();
        }

Und noch wie ich die Bilder bekomme :


void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            //Soll sich das erste Bild der Webcam holen
            if (firstrun == true)
            {
                firstrun = false;
                System.Threading.Thread.Sleep(5000);//Erst aber nach 5 Sekunden
                startImage = (Bitmap)eventArgs.Frame.Clone();
            }
            videoWindow.Image = (Bitmap)eventArgs.Frame.Clone();
            
            
            System.Threading.Thread p = new System.Threading.Thread(new System.Threading.ThreadStart(comparePictures));            
            if (!p.IsAlive)
            {
                actuallImage = (Bitmap)videoWindow.Image.Clone();
                p.Start();
            }
        }

C
40 Beiträge seit 2011
vor 10 Jahren

Hallo Madome31,

du erstellt bei jedem Eintritt des Events einen neuen Thread der deine Bilder vergleicht. Ungünstigerweise synchronisierst du den Zugriff auf "actuallImage" aber nicht, so dass deine Fehlermeldung durch eine Race condition entstehen sollte.
Ich empfehle dir den Zugriff auf actualImage durch lock abzuriegeln.

Zudem würde ich dir empfehlen, das ständige anlegen von Threadobjekten zu überdenken und den Sleep im Event-Handler zu entfernen. Das Event wird ja wahrscheinlich nur dann geworfen wenn tatsächlich auch ein Bild in den EventArgs vorliegt.

Gruß Chris