저는 프로젝트에서 작업 중이고 이미 이미지의 블록을 이미지 (비트 맵)로 그려야합니다. 이미지의 블록은 프로그램의 시작에서 정의합니다)을 표시하고 PictureBox
에 표시합니다. 즉, 새 블록을 수신 할 때마다 이미지를 업데이트합니다.C# 다른 비트 맵 위에 비트 맵 그리기
이 작업을 비동기 적으로 수행하려면 Socket
의 데이터를 읽고 처리하는 Thread
을 사용합니다.
이
내 코드입니다 :객체가
Graphics
생성 줄에서 다른 곳
현재 사용중인
private void MainScreenThread() {
ReadData();
initial = bufferToJpeg(); //full screen first shot.
pictureBox1.Image = initial;
while (true) {
int pos = ReadData();
int x = BlockX();
int y = BlockY();
Bitmap block = bufferToJpeg(); //retrieveing the new block.
Graphics g = Graphics.FromImage(initial);
g.DrawImage(block, x, y); //drawing the new block over the inital image.
this.Invoke(new Action(() => pictureBox1.Refresh())); //refreshing the picturebox-will update the intial;
}
}
private Bitmap bufferToJpeg()
{
return (Bitmap)Image.FromStream(ms);
}
내가 오류를 받고 있어요
Graphics g = Graphics.FromImage(initial);
다른 스레드를 사용하고 있지 않거나 비트 맵에 액세스 할 수 없습니다. 여기에서 문제가 무엇인지 확실하지 않습니다.
누구든지 나를 계몽 할 수 있다면 정말 감사 할 것입니다.
감사합니다.
당신은 발견에 PictureBox이나 비트 맵 클래스가 모두 스레드 안전하다는 것을. Bitmap 클래스에는 PictureBox가 자체적으로 다시 칠하는 동시에 Graphics.FromImage()를 사용할 때 kaboom에 대한 진단 기능이 내장되어 있습니다. 꽤 무작위로, 스레딩 경주 버그가 항상 있습니다. Graphics.FromImage 및 DrawImage와 같은 코드를 더 호출해야합니다. 또는 자신 만의 스레드 세이프 (thread-safe) PictureBox 클래스를 만들면 OnPaint() 재정의는이 메서드에서도 사용할 잠금을 취해야합니다. –
꽤 빨리 OutOfMemoryException을 실행하려고합니다. 각 루프 내에'block'을 처리하고 완료되면'g'를 처리해야합니다. –