Непрерывная утечка памяти при обратном вызове события из Accord VideoCaptureDevice - PullRequest
0 голосов
/ 08 мая 2018

Я получаю постоянную серьезную утечку в обратном вызове моего события от моего Accord VideoCaptureDevice для каждого растрового изображения с моего USB-камеры.

Инициализация:

public static Bitmap latest_frame_buffer_Bitmap = null;                 
// latest camera frame FOV (complete Field Of View) bitmap

Событие:

private static void EVENT_camera_frame(object sender, NewFrameEventArgs camera_frame_event)
{
    if( latest_frame_buffer_Bitmap != null )
    {
        latest_frame_buffer_Bitmap.Dispose();
    }

    latest_frame_buffer_Bitmap = rotation_filter.Apply(new Bitmap(camera_frame_Bitmap.Width, camera_frame_Bitmap.Height, PixelFormat.Format24bppRgb));
 }

Если я закомментирую «latest_frame_buffer_Bitmap = вращение_фильтра ...», то утечки не будет.

1 Ответ

0 голосов
/ 08 мая 2018

Я исправил это, следуя этим замечательным советам «мастеров» ...

Событие NewFrame возникает в рабочем потоке.Но событие Paint возникает в потоке пользовательского интерфейса.Вы не можете использовать Clone (), вы должны сделать глубокую копию.Используйте новый конструктор Bitmap (Image).Вы также не можете безопасно назначить свойство PictureBox.Image в рабочем потоке, вы должны использовать его метод BeginInvoke (), чтобы убедиться, что назначение происходит в потоке пользовательского интерфейса.- Ганс Пассант 16 апреля в 21: 48

Кроме того, что сказал Ганс, попробуйте сделать копию растрового изображения, возвращаемого обработчиком NewFrame, изменив растровое изображение camera_frame_Bitmap = camera_frame_event.Frame;Растровое изображение camera_frame_Bitmap = new Bitmap (camera_frame_event.Frame) ;.Также посмотрите, можете ли вы безопасно клонировать его.- Джими

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...