Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
sasha0192
51 / 51 / 7
Регистрация: 23.01.2012
Сообщений: 449
1

Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке

15.08.2013, 14:23. Просмотров 2376. Ответов 2
Метки нет (Все метки)

Привет
Есть задача - нужно динамически добавлять компоненты. Все работает хорошо.
Но если добавлять через цикл то начинает зависать форма и элементы не прорисовываются.
Вот что получается пока компоненты добавляются.
http://www.cyberforum.ru/attachment....1&d=1376561587
После добавления всех компонентов получится так.
http://www.cyberforum.ru/attachment....1&d=1376561783

Как можно организовать правильное добавление компонентов без всяких зависаний формы и глюков прорисовки ?

Может как то асинхронно или в отдельном потоке.
Нужна помощь, поиск в инете не помог разобраться.
Заранее Спасибо

Вот код как добавляю компонент.
C#
1
2
3
4
5
6
7
8
9
10
        ClassLibrary1.K_v1 tb;
        public void Add(Image Imegs, string Text1, string Text2, string Text3, string Text4)
        {
            tb = new ClassLibrary1.K_v1();
            tb.Dock = DockStyle.Top;
            tb.ForeColor = this.ForeColor;
            tb.Text1to4(Imegs, Text1, Text2, Text3, Text4);
            this.Controls.Add(tb);
            tb.Click += new EventHandler(this.button1_Click);
        }
0
Миниатюры
Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке   Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2013, 14:23
Ответы с готовыми решениями:

ProgressBar в другом потоке
Есть приложение, которое заносит в БД тысячи строк, соответственно форма...

Ивент с реакцией в другом потоке
В главном потоке происходит событие, к примеру А = 5. Как сделать так чтобы...

Синхронизация асинхронных событий в одном потоке
Добрый день! Работаю с веб сервисами. Столкнулся со следующей проблемой на...

Мониторинг переменных, работающих в другом потоке при отладке
Привет всем. Меня заинтересовала одна вещь, я всегда писал однопоточные...

Как реализовать работу клиент-сервера в одном потоке
Привет всем. Пишу вам всем с просьбой помочь. Есть задание на создание клиент...

2
andrew_w2k
324 / 324 / 90
Регистрация: 04.03.2010
Сообщений: 648
15.08.2013, 14:43 2
Invoke
1
Nickopoll
25 / 25 / 3
Регистрация: 10.06.2009
Сообщений: 134
15.08.2013, 15:15 3
После каждого добавления контрола на форму вызывать this.Refresh(), this.Update() или Application.DoEventh(). Только отправить сообщение компоненту (например, нажать на созданную кнопку) в первых двух случаях будет невозможно до окончания создания всех компонентов в цикле, а в последнем - возможно, но не сразу.

А если надо, чтобы компонентами можно было пользоваться до окончания цикла - поместить цикл в отдельный потом, скажем, в BackgroundWorker (документация с примерами в MSDN), и создавать сами компоненты с помощью предложенного выше Invoke, например:
C#
1
2
3
4
5
6
7
                this.Invoke(new MethodInvoker(() => {
                    Button tb = new Button();
                    tb.Location = new Point(0, i * 30);
                    tb.ForeColor = this.ForeColor;
                    tb.Text = (i + 1).ToString();
                    this.Controls.Add(tb);
                }));
где this - объект формы.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2013, 15:15

Распараллеливание: код выполняется еще медленнее чем в одном главном потоке
Здравствуйте! Хочу сделать распараллеливание участка кода, а именно этого: ...

Зависает программа, хотя используется BeginInvoke, и всё должно считаться в другом потоке
У меня есть программа которая моделирует физ процесс, иногда делает это долго,...

Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна.
Помогите исправить ошибку Invoke(new...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru