Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# .NET

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
sasha0192
51 / 51 / 2
Регистрация: 23.01.2012
Сообщений: 449
#1

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

15.08.2013, 14:23. Просмотров 2136. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке (C#):

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

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

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

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

Как реализовать работу клиент-сервера в одном потоке - C#
Привет всем. Пишу вам всем с просьбой помочь. Есть задание на создание клиент серверного приложения. Клиент коннектиться каждые 5...

Распараллеливание: код выполняется еще медленнее чем в одном главном потоке - C#
Здравствуйте! Хочу сделать распараллеливание участка кода, а именно этого: for (int i = 0; i < mas.length; i++) ...

2
andrew_w2k
323 / 323 / 10
Регистрация: 04.03.2010
Сообщений: 648
15.08.2013, 14:43 #2
Invoke
1
Nickopoll
25 / 25 / 1
Регистрация: 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, и всё должно считаться в другом потоке - C#
У меня есть программа которая моделирует физ процесс, иногда делает это долго, чтобы на форму не ставилось Программа не отвечает, решил...

.NET 4.x Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна. - C#
Помогите исправить ошибку Invoke(new MethodInvoker(InvokedConnectionStateChange)); // Ошибка: Невозможно вызвать Invoke или BeginInvoke...

Невозможно вызвать Invoke или BeginInvoke для элемента управления до завершения создания дескриптора окна - C#
Всем привет. Написал класс для загрузки файлов, подключил его к главной форме, нажимаю загрузить, а выдает исключение "Невозможно вызвать...

Работа с Dictionary в одном потоке, при этом он может изменятся в другом потоке - C#
Здравствуйте! Я делаю лабу сервер распределенных вычислений в сети. В одном потоке ожидаю клиентов и на каждого клиента создаю поток. ...


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

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

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