У меня есть фоновый поток, генерирующий Bitmap, когда он готов к кадру, он вызывает событие OnRenderScreen, которое содержит байт [] с генерируемым изображением. Я копирую данные в _frame и делаю недействительным окно изображения, которое рисует фактическое растровое изображение внутри это клиентская область, она работает нормально, но если я разверну форму, я получаю System.InvalidOperationException: «Объект в настоящее время используется где-то еще». Я подозреваю, что это проблема при попытке внести изменения в поток пользовательского интерфейса из фонового потока, но не уверен, как это сделать правильно.
Мой текущий код:
class Ui : Form
{
Bitmap _frame;
Thread _nesThread;
private PictureBox pbRenderOutput;
public Ui()
{
this._console = new Console();
_console.OnRenderScreen += _console_OnRenderScreen;
_frame = new Bitmap(256, 192, PixelFormat.Format32bppArgb);
}
private void _console_OnRenderScreen(object sender, RenderEventArgs e)
{
RenderScreen(e.FrameData);
}
private void RenderScreen(byte[] frameData)
{
BitmapData bmpData = _frame.LockBits(new Rectangle(0, 0, _frame.Width, _frame.Height), ImageLockMode.WriteOnly, _frame.PixelFormat);
byte[] pixelData = new byte[bmpData.Stride * bmpData.Height];
Buffer.BlockCopy(frameData, 0, pixelData, 0, pixelData.Length);
Marshal.Copy(pixelData, 0, bmpData.Scan0, pixelData.Length);
_frame.UnlockBits(bmpData);
pbRenderOutput.Invalidate();
}
private void pbRenderOutput_Paint(object sender, PaintEventArgs e)
{
if (_frame != null)
{
e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;
e.Graphics.DrawImage(_frame, ClientRectangle, new Rectangle(0, 0, _frame.Width, _frame.Height), GraphicsUnit.Pixel);
}
}
}