Ich arbeite an einem Projekt, und ich muss Blöcke von Bildern (als Bitmaps) zeichnen, die ich von einem Socket auf einem bereits vorhandenen Bild (das ich am Anfang des Programms definiere)), und um es auf einem PictureBox
anzuzeigen - mit anderen Worten, um das Bild jedes Mal zu aktualisieren, wenn ich einen neuen Block empfange.C# Bitmap über ein anderes zeichnen
Um dies asynchron zu tun, verwende ich eine Thread
, die die Daten aus der Socket
lesen und verarbeiten.
Dies ist mein Code:
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);
}
Ich
Objekt ist zur Zeit einen Fehler immer im Einsatz an anderer Stelle
Auf der Graphics
Schaffung Linie
Graphics g = Graphics.FromImage(initial);
Ich verwende keine anderen Threads oder etwas, das nicht auf die Bitmap..so ich bin mir nicht sicher, was das Problem hier ist ..
Wenn jemand mich erleuchten kann, werde ich wirklich dankbar sein.
Danke.
Sie gerade entdeckt, dass weder die PictureBox noch die Bitmap-Klasse Thread-sicher sind. Glücklicherweise hat die Bitmap-Klasse eine Diagnose eingebaut, kaboom, wenn Sie Graphics.FromImage() zur selben Zeit verwenden, zu der sich die PictureBox selbst neu paintet. Ziemlich zufällig, wie Threading Race Bugs immer sind. Sie müssen mehr Code aufrufen, auch Graphics.FromImage und DrawImage. Oder erstellen Sie eine eigene threadsichere PictureBox-Klasse, deren OnPaint() - Überschreibung eine Sperre benötigt, die Sie auch bei dieser Methode verwenden. –
Sie werden wahrscheinlich ziemlich schnell in eine 'OutOfMemoryException' hineinrennen, Sie müssen 'block' innerhalb jeder Schleife ablegen und' g' abschaffen, wenn Sie fertig sind. –