System.AccessViolationException:.NET ошибка выполнения рабочего потока c#



У меня есть picturebox в моей форме windows, который отображает поток с моей камеры он использует рабочий поток, как вы можете видеть:



 VideoFileReader reader = new VideoFileReader();
Thread Proceso1;
Proceso1 = new Thread(new ThreadStart(updateui));

public void updateui()
{
try
{
reader.Open(RTSPAddress);
while (true)
{

var previousFrame = pictureRTSP.BackgroundImage;

Bitmap currentFrame = reader.ReadVideoFrame();

pictureRTSP.BackgroundImage = currentFrame;
if (previousFrame != null)
this.Invoke(new MethodInvoker(delegate () {
previousFrame.Dispose();
}));
}
reader.Close();

}
catch(ArgumentException ee)
{
//Text = ee.ToString();
}
}


Я удаляю предыдущий кадр из-за использования памяти .в моей форме у меня есть кнопка, которая использует pictureRTSP.BackgroundImage для обнаружения пластины в видео.Но когда я нажал на кнопку в течение нескольких раз, я получаю эту ошибку:



Application: nMCR.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.AccessViolationException
at <Module>.av_read_frame(libffmpeg.AVFormatContext*, libffmpeg.AVPacket*)
at Accord.Video.FFMPEG.VideoFileReader.readVideoFrame(Int32, System.Drawing.Imaging.BitmapData)
at Accord.Video.FFMPEG.VideoFileReader.ReadVideoFrame()
at nMCR.form.MainForm.updateui()
at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
at System.Threading.ThreadHelper.ThreadStart()


Мой код кнопки:



BitmapImage bmImage = null;



        if (IsRTSP)
{
//FinalImage = new Bitmap(_snapshotHandler.TakeSnapshot().ToImage());

FinalImage = new Bitmap(pictureRTSP.BackgroundImage);



//Bitmap img = (Bitmap)Image.FromStream(FinalImage);
bmImage = new BitmapImage();

using (MemoryStream memStream2 = new MemoryStream())
{
FinalImage.Save(memStream2, System.Drawing.Imaging.ImageFormat.Png);
memStream2.Position = 0;

bmImage.BeginInit();
bmImage.CacheOption = BitmapCacheOption.OnLoad;
bmImage.UriSource = null;
bmImage.StreamSource = memStream2;
bmImage.EndInit();
}


Введите описание изображения здесь

581   1  

1 ответ:

Во-первых, у вас есть проблема в открытии видеочата, я думаю, что есть проблема в целевой платформе вашего решения, попробуйте сделать его 32-битным, некоторые библиотеки, использующие c++ native DLL внутри, могут быть 32-битными и не работать с AnyCPU.

Во-вторых, вы меняете фоновое изображение picturebox из потока, отличного от основного потока:

Попробуйте вызвать Invoke при изменении picturebox изображения:

this.Invoke(new Action(()=>  pictureRTSP.BackgroundImage = currentFrame ));

Comments

    Ничего не найдено.