EasyHero Ответов: 1

Доступ к элементам управления пользовательского интерфейса из другого потока в WPF


Привет, я снимаю изображение с помощью веб-камеры. в зависимости от используемого устройства(ноутбука) захват изображения либо зависает в какой-то момент, либо нет. Чего я хочу добиться, так это убедиться, что захват не замерзнет.

Вот функция, которая захватывает изображение. он использует библиотеку прямого показа
private void captureImage()
       {
           // Release any previous buffer
           if (m_ip != IntPtr.Zero)
           {
               Marshal.FreeCoTaskMem(m_ip);
               m_ip = IntPtr.Zero;
           }

           // capture image
           m_ip = cam.Click();
           b = new Bitmap(cam.Width, cam.Height, cam.Stride, System.Drawing.Imaging.PixelFormat.Format24bppRgb, m_ip);

           // If the image is upsidedown
           b.RotateFlip(RotateFlipType.RotateNoneFlipY);

           System.Windows.Controls.Image win = UIHelper.FindChild<System.Windows.Controls.Image>(System.Windows.Application.Current.MainWindow, "photo");

           win.Source = BitmapToImageSource(b);
           cam.Dispose();
           this.DialogResult = true;
           this.Close();
       }


Что я уже пробовал:

я пытаюсь реализовать асинхронную операцию в обработчике событий Тика таймера диспетчера

void timer_Tick(object sender, EventArgs e)
        {
            i = --i;
            count.Content = i;
            if (i == 2)
            {
                prog.IsActive = true;
                new Task(captureImage).Start();
                
            }
            if (i == 0)
            {
                timer.Stop();
            }
        }


когда я делаю это, я получаю эту ошибку "вызывающий поток не может получить доступ к этому объекту, потому что им владеет другой поток" в этой строке "
System.Windows.Controls.Image win = UIHelper.FindChild<System.Windows.Controls.Image>(System.Windows.Application.Current.MainWindow, "photo");
"в функции захвата

но когда я использую диспетчера.Вызвать такой
this.Dispatcher.Invoke((Action)(() =>
                {
                    captureImage();
                }));

кадр все еще зависает, есть идеи, как это исправить?

1 Ответов

Рейтинг:
2

Bernhard Hiller

Изучите основы MVVM. Свяжите свойства некоторых элементов управления (представления) со свойствами модели представления. Механизм связывания заботится о правильной резьбе. В вашей модели запустите поток для захвата изображения, поднимите событие в ViewModel для каждого нового изображения.