Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача данных из потока в Image 
V
    Опции темы
vikaz
Дата 24.10.2011, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 1
Всего: 12



Всем привет! Возник вопрос. У меня есть пример для работы с один SDK. И там присутствуют подобные функции, как ниже:

Код

private void UpdateScreenImage(Bitmap hBitmap)
{
   if (!this.Dispatcher.CheckAccess())
   {
      this.Dispatcher.Invoke(_setImageCallback = UpdateScreenImage, new object[] { hBitmap });
    }
    else
    {
     BitmapSource bmp1 = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

     PictureFingerPrint.Source = bmp1;
   }
}

Код

private void OnTakeOff(FTR_PROGRESS Progress)
{
  this.SetStatusText("Take off finger from device, please...");
 }

Код

private void SetStatusText(string text)
        {
            if (m_bExit) return;

            if (!this.Dispatcher.CheckAccess())
            {
                this.Dispatcher.Invoke(_setTextCallback = SetStatusText, new object[] { text });
            }
            else
            {
                this.txtMessage.Text = text;
            }
        }


Как я понимаю, условие if (!this.Dispatcher.CheckAccess())
позволяет изменить состояния контрола из потока его (контрол) не создававшего. Я для себя решил, что мой класс адаптер будет работать только в WPF приложении. 

Вопрос, можно ли подобные функции переложить на привязку данных? Т.е. функция UpdateScreenImage
будет иметь сл. вид:

Код

private void UpdateScreenImage(Bitmap hBitmap)
{
  BitmapSource bmp1 = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions()); 
  Bitmap = bmp1;
}

 
, где Bitmap:
 
Код

public Bitmap Bitmap
{
   get { return _bitmap; }
   set
   {
      _bitmap = value;
      OnPropertyChanged("Bitmap");
    }
}

 
Ну а Image будет иметь сл. вид:

 
Код

<Image Source="{Binding Bitmap}"/>

 
Правильно ли все это? Или это в корне неверный подход и нужно делать по другому?


ЗЫ. Компилятор, все же, выдает ошибку:"Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."
Хотя я так же через DataBinding, обновляю данные в контроле TextBox, и там таких проблем не возникает. Все работает как часы. :(

Может есть у кого-то мысли по этому поводу? Заранее спасибо!

Это сообщение отредактировал(а) vikaz - 24.10.2011, 19:42


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Gvozdin
Дата 25.10.2011, 06:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Если работа идет не в UI потоке, то этого ни кто кроме вас изменить не сможет. Dispatcher.Invoke как раз и ставит вызов в очередь UI потока.

Весь код который общается с WPF должен делать это в UI потоке.

Чем не устраивают Dispatcher.Invoke?
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
vikaz
Дата 25.10.2011, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 1
Всего: 12



Цитата

Чем не устраивают Dispatcher.Invoke?


Они меня устраивали, когда я напрямую из кода обращался к контролу.
Но как только я стал исрользовать Property для переброски значения, он перестал меня удовлетворять, так как ошибка осталась.
Возможно что-то делаю не так.
но в новом классе, я не могу использовать вот такой код:
Код

this.Dispatcher.CheckAccess()

Могу только вот так:
Код

Dispatcher.CurrentDispatcher.CheckAccess()

Но он всегда выдает true

Это сообщение отредактировал(а) vikaz - 25.10.2011, 07:59


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Gvozdin
Дата 25.10.2011, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Давайте конкретно, на какой строке кода падает?

Dispatcher.CurrentDispatcher.CheckAccess() естественно вернет true, тк это диспетчер привязанный к текущему потоку, если его нет то он создается.

Почему this.Dispatcher не можете использовать? Передавайте диспетчер в качестве параметра метода, или вы в любом месте WPF приложения можете использовать Application.Current.Dispatcher, тк UI поток обычно один, то и диспетчер всегда будет нужный.
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
vikaz
Дата 26.10.2011, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: 1
Всего: 12



Gvozdin, спасибо! Передал Dispatcher в мой класс и там его проверяю. Прокатило. СПС!

Это сообщение отредактировал(а) vikaz - 26.10.2011, 18:50


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Frostiboy
Дата 7.11.2011, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 7.11.2011

Репутация: нет
Всего: нет



А это единственный способ?
PM MAIL   Вверх
Gvozdin
Дата 7.11.2011, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 9.8.2011
Где: Москва

Репутация: 8
Всего: 8



Единственный способ чего?

Просто доступ к объектам WPF возможен только из UI потока.
--------------------
http://gvozdin.ru
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0789 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.