각 스레드가 분석하고 일부를 변경하는 그림 상자에서 특정 비트 맵을 가져 와서이를 그림 상자에 다시 저장하는 다중 스레드 프로그램을 만들려고합니다. 공유 비트 맵 개체와 그림 상자를 다루는 지침에 lock()을 사용했지만 어떤 이유로 인해 6-10 개마다 "개체가 현재 다른 곳에서 사용 중"오류가 발생합니다.C# 이미지 병합시 스레딩 잠금 오류
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();
}
나는 잠금() 메소드에 찾을 수있는만큼 읽으려고했지만 그렇게 내가 잘못했을 수도 여전히 약간 불분명하다. 그래서 내 질문은, 왜 잠금 스레드가 지침을 실행하지 못하도록 방지 무엇입니까? 내가 그것을 잘못 사용한 적이 있습니까? 아니면 사용할 수있는 임시 해결책이 있습니까?
이 문제에 대한 도움을 주시면 대단히 감사하겠습니다.
gr.DrawImage (bmp, new Rectangle (0, 0, 0, 0)) 줄에 "bmp"는 무엇입니까? ? 이것이 bmp2일까요? –
bmp는 doThread() 함수 내에서 선언 된 비트 맵입니다. bmp의 내용을 bmp2로 복사하고 있습니다. bmp는 현재 스레드가 작업 한 비트 맵의 일부를 저장합니다. – Bogdan
bmp2는 자물쇠 밖에서 사용할 수 있습니까? 그렇지 않으면 어디에서 오류가 발생하는지 알 수 없습니다. –