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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BackgroundWorker - не всегда работает у меня : ( 
:(
    Опции темы
LectorSP
Дата 14.7.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня такой вопрос, почему в обработчике события DoWork, я спокойно могу вызвать метод, который возвращает массив срок и передать его как результат работы нового потока , но не могу вызвать метод который создает и возвращает например TabItem? Как только в новом потоку появляеться строка типа TabItem item = new TabItem() поток возвращает ошибку типа "The calling thread must be STA, because many UI components require this." Подскажите или нужно делать через Thread? :
--------------------
Трудно жить на свете негритенку Пете, Бьет его по роже  пионер Сережа! Никакими расовыми этническими и религиозными предрассудками я не страдаю!Я за DOT.NET......................ну и за мир во всем мире тоже!
PM MAIL ICQ   Вверх
Partizan
Дата 14.7.2008, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



LectorSP, ну а почему бы не сделать через Thread?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LectorSP
Дата 14.7.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А как мен тогда из нового потока, который я создал, предать тот же TabItem, который сгенерился в новом потоке?
--------------------
Трудно жить на свете негритенку Пете, Бьет его по роже  пионер Сережа! Никакими расовыми этническими и религиозными предрассудками я не страдаю!Я за DOT.NET......................ну и за мир во всем мире тоже!
PM MAIL ICQ   Вверх
Partizan
Дата 14.7.2008, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



LectorSP, через Invoke() делегата

Это сообщение отредактировал(а) Partizan - 14.7.2008, 18:15


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LectorSP
Дата 14.7.2008, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а можно пару строчек код, если конечно не сложно : ) 
--------------------
Трудно жить на свете негритенку Пете, Бьет его по роже  пионер Сережа! Никакими расовыми этническими и религиозными предрассудками я не страдаю!Я за DOT.NET......................ну и за мир во всем мире тоже!
PM MAIL ICQ   Вверх
Partizan
Дата 14.7.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



Код

        private delegate void SetButton(Button btn);

        private void MySetButton(Button btn)
        {
            this.Controls.Add(btn);
            btn.Left = 0;
            btn.Top = 0;
            btn.Text = "Hello, World";
            btn.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ThreadStart threadFunc = new ThreadStart(ThreadFunc);
            Thread thread = new Thread(threadFunc);
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }

        private void ThreadFunc()
        {
            Button btn = new Button();
            SetButton setBtnDelegate = new SetButton(MySetButton);
            this.Invoke(setBtnDelegate, btn);
        }



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LectorSP
Дата 14.7.2008, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



не рарботает постоянно выдает вот это Exception has been thrown by the target of an invocation : (
--------------------
Трудно жить на свете негритенку Пете, Бьет его по роже  пионер Сережа! Никакими расовыми этническими и религиозными предрассудками я не страдаю!Я за DOT.NET......................ну и за мир во всем мире тоже!
PM MAIL ICQ   Вверх
Partizan
Дата 14.7.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



LectorSP, показывайте свой код

Добавлено через 20 секунд
а лучше весь sln сюда для экспериментов...

Добавлено через 1 минуту и 24 секунды
LectorSP, Exception has been thrown by the target of an invocation как правило означает что исключение произошло в конструкторе при создании объекта


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LectorSP
Дата 14.7.2008, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Этот пример тоже не работает : (

Код



public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private delegate void SetButton(Button btn);

        private void MySetButton(Button btn)
        {
            btn.Width = 100; // <- вылетает вот тут. Сам объект на null, однако все свойства помечены как [The calling thread cannot access this object because a different thread owns it.]
            btn.Height = 25;
            btn.Content = "Hello world";

            DockPanel.SetDock(btn, Dock.Top);

            dockPanel.Children.Add(btn);
           
        }

        private void btnGo_Click(object sender, EventArgs e)
        {
            ThreadStart threadFunc = new ThreadStart(ThreadFunc);
            Thread thread = new Thread(threadFunc);
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }

        private void ThreadFunc()
        {
            Button btn = new Button();
            SetButton setBtnDelegate = new SetButton(MySetButton);
            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, setBtnDelegate, btn);
        }

--------------------
Трудно жить на свете негритенку Пете, Бьет его по роже  пионер Сережа! Никакими расовыми этническими и религиозными предрассудками я не страдаю!Я за DOT.NET......................ну и за мир во всем мире тоже!
PM MAIL ICQ   Вверх
Partizan
Дата 14.7.2008, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



LectorSP, я приводил пример для WinForms....
в вашем случае:

Код

public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        private delegate void SetButton();
        private void MySetButton()
        {
            Button btn = new Button();
            btn.Width = 100; // <- вылетает вот тут. Сам объект на null, однако все свойства помечены как [The calling thread cannot access this object because a different thread owns it.]
            btn.Height = 25;
            btn.Content = "Hello world";
            DockPanel.SetDock(btn, Dock.Top);
            dockPanel.Children.Add(btn);
           
        }
        private void btnGo_Click(object sender, EventArgs e)
        {
            ThreadStart threadFunc = new ThreadStart(ThreadFunc);
            Thread thread = new Thread(threadFunc);
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }
        private void ThreadFunc()
        {
            SetButton setBtnDelegate = new SetButton(MySetButton);
            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, setBtnDelegate, null);
        }



--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LectorSP
Дата 14.7.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



да, в моем случае WPF - и там почему-то так не работает : (
--------------------
Трудно жить на свете негритенку Пете, Бьет его по роже  пионер Сережа! Никакими расовыми этническими и религиозными предрассудками я не страдаю!Я за DOT.NET......................ну и за мир во всем мире тоже!
PM MAIL ICQ   Вверх
Partizan
Дата 14.7.2008, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



LectorSP, =) вы Dispatcher не у того потока берёте )

Добавлено через 2 минуты и 37 секунд
хотя может я и не прав...

Добавлено через 8 минут и 27 секунд
LectorSP
Код

public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
        private delegate void SetButton();
        private void MySetButton()
        {
            Button btn = new Button();
            btn.Width = 100; // <- вылетает вот тут. Сам объект на null, однако все свойства помечены как [The calling thread cannot access this object because a different thread owns it.]
            btn.Height = 25;
            btn.Content = "Hello world";
            DockPanel.SetDock(btn, Dock.Top);
            dockPanel.Children.Add(btn);

        }
        private void btnGo_Click(object sender, EventArgs e)
        {

        }
        private void ThreadFunc()
        {
            SetButton setBtnDelegate = new SetButton(MySetButton);
            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, setBtnDelegate);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            ThreadStart threadFunc = new ThreadStart(ThreadFunc);
            Thread thread = new Thread(threadFunc);
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
        }
    }




--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LectorSP
Дата 14.7.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дело в том, что если не передавать контрол, который сгенерил второй параллельный поток, а просто, во время выполнния этого потока получить доступ к контролам первого потока, то все работает отлично... А вот как сделать так, что бы передать контрол из одного потока в другой, не получаеться : (


--------------------
Трудно жить на свете негритенку Пете, Бьет его по роже  пионер Сережа! Никакими расовыми этническими и религиозными предрассудками я не страдаю!Я за DOT.NET......................ну и за мир во всем мире тоже!
PM MAIL ICQ   Вверх
Partizan
Дата 14.7.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



LectorSP, если контрол создан в одном из потоков, то он и принадлежит диспетчеру этого потока и никакому другому...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
LectorSP
Дата 14.7.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот тут ответ на вопрос, как это нужно делать используя WPF - http://www.nbdtech.com/blog/archive/2007/0...ource-Code.aspx  : )))

PS: Partizan, тебе огромное спасибо за то что потдержал меня в этом вопросе : )
--------------------
Трудно жить на свете негритенку Пете, Бьет его по роже  пионер Сережа! Никакими расовыми этническими и религиозными предрассудками я не страдаю!Я за DOT.NET......................ну и за мир во всем мире тоже!
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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