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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [WPF] Создать контрол в отдельном треде, и потом использовать в главном треде 
V
    Опции темы
Kefir
Дата 20.9.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

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



Итак, проблема такова:
1. Есть UserControl (назовём его MyUserControl), который показывает информацию (не суть какую).
2. Для присвоения информации у контрола есть проперти:
Код

public Info Info
{
    get { return this._Info; }
    set
    {
        this._Info = value;
        // дальше идёт загрузка картинок, панорама, интерактивная карта и тому подобное, что занимает достаточно немало времени
    }
}

Вывод - надо создавать этот контрол в отдельном треде, а в главном треде показывать табличку "Подождите".
Итак.
Код

        // Это метод для вызова из главной программы
        private void LoadInfo(Info info)
        {
            // Это мы говорим, что надо начать показывать картинку загрузки
            this._Host.LoadScreenStart("Please wait. Loading information about " + department.Name + "...");
            // Создаём тред
            Thread t = new Thread(this.ThreadNewMyUserControl);
            // Как показала практика, нужен СТА тред для создания контролов (иначе будет эксепшн)
            t.SetApartmentState(ApartmentState.STA);
            // запускаем тред
            t.Start(info);
        }

        // Это метод, который будет в треде
        private void ThreadNewMyUserControl(object info)
        {
            // Создаём контрол
            MyUserControl uc = new MyUserControl();
            // Присваеваем проперти нужное значение
            uc.Info = (Info)info;
            // Говорим что треда закончилась.
            // this._SyncContext - это поле класса типа SynchronizationContext.
            // получается в конструкторе как = SynchronizationContext.Current
            this._SyncContext.Post(this.FinishLoading, uc);
        }

        // Это метод, который будет вызван через this._SyncContext из метода ThreadNewMyUserControl при завершении работы
        private void FinishLoading(object result)
        {
            // Вот это и есть проблемное место. Внутри функции AddTab созданный контрол добавляется на главную форму
            // и выводит эксепшн "The calling thread cannot access this object because a different thread owns it."
            this.Host.AddTab("blah-blah", (result as MyUserControl).Info.Name, (MyUserControl)result);
            // Говорим, что надо убрать табличку загрузки
            this._Host.LoadScreenStop();
        }

собственно говоря вот и проблема (на строке 32 кода, строки 30-31 - описание проблемы). созданный в другом треде контрол недоступен из главного треда. что делать?

мои мысли были таковы - создавать контрол в главном треде, а присваивать проперти уже в отдельном, так ведь у меня нет специального поля для контрола, а значит я не смогу вызвать Invoke или ещё что-то в этом роде.

В общем, помогите, люди добрые.

Это сообщение отредактировал(а) Kefir - 20.9.2007, 16:50
PM MAIL WWW Skype   Вверх
Kefir
Дата 21.9.2007, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

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



небольшой апдейт.
1. вариант создать с UI тереде и присвоить проперти из другого не проходит, ибо делается это через Invoke, который блокирует UI тред. Увидел слово async в описании BeginInvoke и всё равно сразу сник, ибо это совсем не то что надо. Вывод - это невозможно, потому что  объект всё равно принадлежит UI треду, а значит и присвоение проперти будет проходит в UI треде.
2. вообще смысл всей этой проблемы в том, что я хочу показать "Подождите" пока грузится контрол. так вот я смотрел на это очень однобоко. решение очень простое - создать ещё одно окно и показывать его примерно так:
Код

PopupWindow pw = new PopupWindow();
pw.Show();

// грузим нужные контролы

pw.Hide();

Вот и всё. До сих пор не понимаю как это я сразу не догадался.

Вывод:
1) создать контрол в отдельном треде невозможно...
2) ...и ненужно, ибо вышеописанный способ решает эту проблему намного проще.
Вопрос помечаю решённым.

Добавлено через 1 минуту и 16 секунд
ЗЫ А вообще мне нравится как я тут создаю темы и сам себе потом пишу ответы в последнее время (по крайней мере относительно WPF и подобного).

Это сообщение отредактировал(а) Kefir - 21.9.2007, 15:25
PM MAIL WWW Skype   Вверх
thomas
Дата 21.9.2007, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

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



Kefir, 
Так с WPF ни кто практически не работает.

А этот контрол, я так понимаю, ты хотел на своем сайте использовать? 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Kefir
Дата 21.9.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

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



я же не в упрёк форуму сказал. просто так, к слову  smile 
а под веб я не нишу. виндовское приложение у меня.
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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