J'essaie de créer un programme multithread qui prend un certain bitmap à partir d'une zone d'image où chaque thread analyse et modifie une partie de celui-ci, puis l'enregistre dans l'image. J'ai utilisé un verrou() pour les instructions qui traitent de l'objet bitmap partagé et de la zone d'image, mais pour une raison quelconque, je reçois toujours des erreurs "L'objet est actuellement utilisé ailleurs" toutes les 6 à 10 fois.Erreur de verrouillage de threads C# lors de la fusion d'images
private Object locker = new Object();
void doThread(Bitmap bmp2) //simplified - other references not important
{
//some code here
//....
lock (locker)
{
Graphics gr = Graphics.FromImage(bmp2); //this is where i get the errors, they're related to bmp2
gr.DrawImage(bmp, new Rectangle(0, 0, 800, 600));
gr.Dispose();
pictureBox1.Image = bmp2;
}
}
void runThreads()
{
Bitmap bmp2 = new Bitmap(pictureBox1.Image);
Thread thread1 = new Thread(delegate() { doThread(bmp2); });
Thread thread2 = new Thread(delegate() { doThread(bmp2); });
Thread thread3 = new Thread(delegate() { doThread(bmp2); });
Thread thread4 = new Thread(delegate() { doThread(bmp2); });
thread1.Start();
thread2.Start();
thread3.Start();
thread4.Start();
}
J'ai essayé de lire autant que je pouvais trouver sur la méthode de verrouillage(), mais il est encore un peu clair si je pourrais avoir abusé. Donc ma question est, pourquoi le verrou empêchant les threads d'exécuter les instructions? Ai-je abusé? Ou existe-t-il une solution de contournement que je pourrais utiliser?
Toute aide avec ceci est grandement appréciée.
Qu'est-ce que "bmp" dans la ligne gr.DrawImage (bmp, new Rectangle (0, 0, 0, 0)); ? Est-ce que ça devrait être bmp2? –
bmp est un bitmap déclaré à l'intérieur de la fonction doThread(), je copie le contenu de bmp en bmp2. BMP stocke la partie du bitmap avec laquelle le thread actuel a travaillé. – Bogdan
bmp2 est-il utilisé à l'extérieur de la serrure? Je ne vois pas où l'erreur se produit autrement. –