powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Обновление контрола из другого потока
9 сообщений из 9, страница 1 из 1
Обновление контрола из другого потока
    #38132407
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый.
Вопрос конечно уже заезженный, но почему то решение не работает О_о

В общем, имеется AForge для работы с веб-камерой. Но контрол там виндовский. Поэтому забиндить на VideoSource не получается (используем таки MVVM).

Вариант - сделать контрол Image и в его Source биндить картинку, получаемую в коде.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
 private BitmapImage frameSource;
        public BitmapImage FrameSource
        {
            get
            {
                return this.frameSource;
            }
            set
            {
                this.frameSource = value;
                OnPropertyChanged("FrameSource");
            }
        }

 private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image)
        {
            MemoryStream mem = new MemoryStream();
            image.SetResolution(300, 300);
            image.Save(mem, System.Drawing.Imaging.ImageFormat.Bmp);

            mem.Position = 0;
            BitmapImage imageOut = new BitmapImage();
            imageOut.BeginInit();
            imageOut.StreamSource = mem;
            imageOut.EndInit();
            this.FrameSource.Dispatcher.BeginInvoke(new MyDelegate(aaa), imageOut); //delegate() { this.Frame = image1; });
            mem.Close();

        }

        delegate void MyDelegate(BitmapImage imageOut);

        void aaa(BitmapImage imageOut)
        {
            this.FrameSource = imageOut;
        }



private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image) - обработчик события нового кадра, идущего с камеры.

Ошибка, "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток." все равно вылезает.

Есть подозрение, что Invoke надо вызывать у самого контрола. Но мы же в MVVM и тут мы тока с Source-ом работаем.

Подскажите, пожалуйста, в чем проблема.
...
Рейтинг: 0 / 0
Обновление контрола из другого потока
    #38133263
unknownfromrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky Dragon,

Ты хоть и в MVVM - но тебе никто не мешает вызывать Application.Dispatcher
...
Рейтинг: 0 / 0
Обновление контрола из другого потока
    #38133278
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
unknownfromrus,

да, уже вызывал. Но это не помогло.
Перенес всю обработку картинки в делегат

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
   private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image)
        {
            if (App.Current != null)
                App.Current.Dispatcher.BeginInvoke(new MyDelegate(aaa), image);
        }


        delegate void MyDelegate(Bitmap image);

        void aaa(Bitmap image)
        {
            MemoryStream mem = new MemoryStream();
            image.SetResolution(300, 300);
            image.Save(mem, System.Drawing.Imaging.ImageFormat.Bmp);

            mem.Position = 0;

            BitmapImage imageOut = new BitmapImage();
            //imageOut.
            imageOut.BeginInit();
            imageOut.StreamSource = mem;
            imageOut.EndInit();
            this.FrameSource = imageOut;
            mem.Close();
        }



Эксепшен больше не вылетает. Но изображение не появляется в окне :(
Биндинг правильно настроен. OnPropertyChange вызывается...
...
Рейтинг: 0 / 0
Обновление контрола из другого потока
    #38133279
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
unknownfromrus,

точнее помогло, но не до конца)
...
Рейтинг: 0 / 0
Обновление контрола из другого потока
    #38133483
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помнится, в свое время я отказался от Bitmap в пользу WriteableBitmap в качестве Image.Source, но это было не из-за ошибок, а ради быстродействия (пришлось слегка модифицировать AForge, чтобы в NewFrame отгружался не Bitmap а указатель на видеобуфер, из которого далее напрямую в WriteableBitmap.BackBuffer)... а вот как там было первоначально с Bitmap, работало но медленно, уже не вспомню, но наверняка не MVVM )))
...
Рейтинг: 0 / 0
Обновление контрола из другого потока
    #38133575
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,

Учтем, посмотрим, спасибо )
...
Рейтинг: 0 / 0
Обновление контрола из другого потока
    #38133588
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,

Забавно. Просто поменял на WriteableBitmap, создавая его new WriteableBitmap(image);
И изображение появилось...
...
Рейтинг: 0 / 0
Обновление контрола из другого потока
    #38133655
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sky Dragon,

))) забавно, но Вы же понимаете, что неэффективно на каждый кадр создавать новый WriteableBitmap, эффективно работать с его BackBuffer, с последующим AddDirtyRect для обновления (для этого достаточно "упростить" AForge...VideoCaptureDevice.Grabber.BufferCB - не создавать там Bitmap, а сразу отгружать IntPtr buffer подписчикам NewFrame)
...
Рейтинг: 0 / 0
Обновление контрола из другого потока
    #38133759
Sky Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR,

Понимаем конечно)

Просто пока экспериментируем) Да и в чужой фреймворк лезть никогда неохота))
Но за идею спасибо)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Обновление контрола из другого потока
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]