2012-04-12 3 views
0

Хорошо, у меня есть объект изображения wpf, и он отображает живые изображения. Поэтому я использовал таймер для обновления изображения.Проблемы с визуализацией WPF

public void LoadLiveImage() 
     { 

System.Windows.Media.PixelFormat pf = PixelFormats.Bgr24; 
        int stride = 4 * ((24 * cameraFrame.img_width + 31)/32); 
        BitmapSource bmpImage= BitmapSource.Create(cameraFrame.img_width, cameraFrame.img_height, cameraFrame.img_width, cameraFrame.img_height, pf, null, cameraFrame.img_pixel, stride); 
        RemoteCameraImage.Source = bmpImage; 
} 

void dispatcherTimer_Tick(object sender, EventArgs e) 
     { 
      LoadLiveImage();   

     } 

Нет проблем, это нормально работает. Однако я попытался переместить это в поток, и изображение не отображается.

private void showLiveImage() 
     { 
       while (this.isCameraViewOpen) 
       { 
       if (RemoteCameraImage.Dispatcher.CheckAccess()) 
         { 
          System.Windows.Media.PixelFormat pf = PixelFormats.Bgr24; 
          int stride = 4 * ((24 * cameraFrame.img_width + 31)/32); 
          BitmapSource bmpImage = BitmapSource.Create(cameraFrame.img_width, cameraFrame.img_height, cameraFrame.img_width, cameraFrame.img_height, pf, null, cameraFrame.img_pixel, stride); 
          RemoteCameraImage.Source = bmpImage; 

          System.Threading.Thread.Sleep(5); 
         } 
         else 
          this.RemoteCameraImage.Dispatcher.Invoke(DispatcherPriority.Normal, new ImageUpdater(this.showLiveImage)); 

        } 

} 

ShowLiveImage ispunning как нить. Изображение получено, в этом нет проблем. Я протестировал, сохранив массив img_pixel в файле bmp, и файл сгенерирован. Просто изображение не отображается. Поэтому я помещаю сообщение, которое будет показано после назначения источника, и затем я смогу увидеть изображение на объекте Image. Я думаю, что проблема в том, что я увеличил время сна, но даже изображение не обновляется. В чем может быть проблема?

EDIT: После перемещения кода, который обновлял изображение до другой функции, он отлично работает. И я использовал BeginInvoke() вместо того, чтобы вызывать все работает отлично.

ответ

0

Некоторое время назад у меня был похож проблемы, и я нашел это на Stackoverflow, который sovled для меня

Images on second thread

WPF Dispatcher {"The calling thread cannot access this object because a different thread owns it."}

Если у вас нет намерения изменения изображения, как только вы созданный его можно заморозить с помощью Freezable.Freeze, а затем назначить GeneratedImage в делегате диспетчера (BitmapImage становится read-onl y и, следовательно, потокобезопасны в результате Freeze). Другой вариант - загрузить изображение в MemoryStream в фоновом потоке , а затем создать BitmapImage в потоке пользовательского интерфейса в делегат диспетчера с этим потоком и свойство StreamSource BitmapImage.

+0

Проблема не в том, что диспетчер не может получить доступ к объекту. Если я добавлю какое-то действие пользователя в поток, например MessageBox, изображение будет отображаться. Я также попытался заморозить, это не решило проблему. – xaria

0

Попробуйте использовать Application.Current.Dispatcher вместо одного вы использовали. Я считаю, что это будет трюк.

Cheers

+0

Nah ... не работает :( – xaria

Смежные вопросы