私はプロジェクトに取り組んでいます。すでに存在するイメージのソケットから受け取ったイメージのブロック(ビットマップとして)を描画する必要があります)、それを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クラスでもないが、スレッドセーフであることを発見。 Bitmapクラスには、PictureBoxが再描画するのとまったく同時にGraphics.FromImage()を使用すると、kaboomのためにそのための診断が組み込まれています。ランダムな、スレッドレースバグのようなものはいつもあります。 Graphics.FromImageとDrawImageというコードをさらに呼び出す必要があります。独自のスレッドセーフPictureBoxクラスを作成する場合、そのOnPaint()オーバーライドでは、このメソッドでも取るロックを行う必要があります。 –
これでかなり早く 'OutOfMemoryException'を実行することになるでしょう。各ループ内に' block'を配置し、実行したら 'g'を処分する必要があります。 –