Не удается обновить графический интерфейс WPF при использовании неуправляемых библиотек в фоновом режиме - PullRequest
3 голосов
/ 18 апреля 2011

Я обнаружил проблему при попытке использовать Emgu для захвата изображений с веб-камеры.Для этого Emgu использует неуправляемые библиотеки opencv.Поэтому проблема в том, что я не могу обновить свой графический интерфейс (WPF Image control) из события Elapsed System.Timers.Timer.Я знаю, что он работает в другой ветке, но эй, вот почему я использую Dispatcher.Это первый раз, когда я не могу сделать это с Диспетчером.Получение InvalidOperationException с «Вызывающим потоком не удается получить доступ к этому объекту, так как он принадлежит другому потоку».Я провел целый день в поисках решения, но все еще не мог его исправить.Любые идеи, почему это происходит?

webcam.OnNewFrame += newBitmapSource => this.imgCaptured.Dispatcher.Invoke
            (
                new Action(delegate
                    {
                        this.imgCaptured.Source = newBitmapSource;
                    }),
                DispatcherPriority.Background
            );

Последнее, что на Stack Trace: System.Windows.Threading.Dispatcher.VerifyAccess ()

Однако, если я вызываю Dispatcher.CheckAccess () возвращает true.

ОБНОВЛЕНИЕ:

Наконец-то я выяснил это сам: BitmapSource должен был быть создан в потоке пользовательского интерфейса.Кажется, он не может использовать этот объект иначе.

1 Ответ

1 голос
/ 18 апреля 2011

Вы пытались установить его в не фоновый поток. Интересно, если это проблема - обновление пользовательского интерфейса из фонового потока.

Кроме того, в нем говорится, что вы должны заморозить ресурсы Bitmap, прежде чем пытаться разделить их между различными потоками - рабочим потоком и потоком пользовательского интерфейса. См. Ссылки ниже.

WPF Dispatcher {"Вызывающий поток не может получить доступ к этому объекту, поскольку он принадлежит другому потоку."}

http://social.msdn.microsoft.com/Forums/en-US/windowswic/thread/9223743a-e9ae-4301-b8a4-96dc2335b686

...