Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267

Закрепление контролов из разных потоков в одной форме

17.02.2012, 14:34. Показов 2699. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как правильно закрепить к примеру текстбокс или баттон созданные в другом потоке, в форме которая создана в основном потоке? При Controls.Add вылезает ошибка, но через Invoke ее можно решить. Но когда Я вызываю метод Show(), через Invoke то он ругается что к моей форме не в том потоке доступ, если без Invoke, то ругается что доступ не с того потока к моим добавляемым контролам. Судя по всему это изза перебора всех дочерних элементов в формы при вызове метода Show()
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.02.2012, 14:34
Ответы с готовыми решениями:

В одной форме два разных класса
InitializeComponent() для inputBox_edit() не реализуется namespace stratConv { public partial class inputBox_add : Form { ...

Закрепление формы на форме
Нужно на основной форме сделать так что при нажатии на button в текушей форме открывалась вторая форма. Но и также она была одной целевой...

Генерация контролов. Использование потоков
Привет всем). Я делаю программу для генерации плейлистов. Имеется метод GenConrol, который генерирует элементы управления для каждой...

14
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
17.02.2012, 17:30
Ну код покажи, а так ты просто рассказал о своей проблеме.

Ну вот так всё работает.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Threading;
using System.Windows.Forms;
 
namespace WinForms_AddControl
{
    public partial class FirstForm : Form
    {
        SecondForm _secondForm;
 
        public FirstForm()
        {
            InitializeComponent();
            _secondForm = new SecondForm();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            _secondForm.Show();
            ThreadPool.QueueUserWorkItem((unused) =>
                {
                    Button btn = new Button();
                    btn.Text = "Нажми меня";
                    btn.Width = 85;
 
                    _secondForm.Invoke(new Action(() =>
                        {
                            _secondForm.Controls.Add(btn);
                        }));
                });
        }
    }
}
1
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
17.02.2012, 19:30  [ТС]
Не, немного не то что мне надо. вот примерный код



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public partial class Form1 : Form
{
    public static Form1 Instance;
    static Thread  thr = new Thread(new ThreadStart(createnewform));
    public Form1()
    {
        Instance = this;
        this.TopLevel = false;
        thr.Start();
    }
    static void createnewform()
    {
        Form2 form = new Form2();
    }
 
 
}
public partial class Form2 : Form
{
    public Form2()
    {
        this.Controls.Add(Form1.Instance);
        this.Show();//Должна вызываться в нужный мне момент а не только при создании формы
    }
}
Почему именно так организованы формы лучше не спрашивайте), мне так нужно и от этого никак не уйти. Это упрощенный вариант исходной ситуации
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
17.02.2012, 20:02
Цитата Сообщение от 444866 Посмотреть сообщение
мне так нужно и от этого никак не уйти
Уверен что далеко не факт. Я уверен, что это и есть основная проблема.

Судя по коду ты пытаешься добавить первую форму на вторую?

Что сделать вообще пытаешься?
0
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
17.02.2012, 21:33  [ТС]
Нет уйти не получится точно. Лучше придумать как закрепить форму одного потока в форме другого. Это редактор как бы и мне нужно чтобы одна из форм работала в другом потоке для большей скорости работы.

Ну в чем проблема я собвственно описал в первом посте, осталось понять как потокобезопасно вложить форму в форму
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
17.02.2012, 21:51
А нельзя например какие-либо операции делать в других потоках, а результат уже выводить на эту другую форму (не главную)? Просто странное решение выводить форму в другом потоке, чтобы ускорить работу.
0
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
17.02.2012, 22:10  [ТС]
Нет, те операции жестко привязаны к форме и вызываются из исходника (если точнее то не совсем форма а XNA Game, но она легко превращается в форму которую можно крепить в другую форму)
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
17.02.2012, 22:14
А так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void CreateNewForm()
        {
            Form2 form = new Form2(this);
            form.ShowDialog();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thr = new Thread(new ThreadStart(CreateNewForm));
            thr.Start();
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
    public partial class Form2 : Form
    {
        Form1 _mainForm;
 
        public Form2(Form1 mainForm)
        {
            InitializeComponent();
            _mainForm = mainForm;
        }
    }
Добавлено через 1 минуту
Вообще много деталей не ясно, поэтому возможно я что-то не то выложил.

Добавлено через 2 минуты
Опиши подробнее, что нужно в итоге. В каком порядке, что происходит. Как вообще всё это видишь. Вроде такого описания: Есть главное окно, из него можно открыть сколько угодно окон и каждое в новом потоке. В главном окне должны быть ссылки на эти окна, а в дочерних ссылки на главное окно. Из главного окна я должен "уметь" добавлять на дочерние окна элементы управления и т.д.
0
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
17.02.2012, 22:26  [ТС]
Не, в твоем примере мы просто создаем форму в другом потоке, но не закрепляем ее.


Я уж не знаю какие детали нужны если честно, я вроде выложил пример и указал что должно получится.

Опишу еще раз попробую:

1) Создается форма при старте приложения.
2) Внутри формы создается поток в котором создается новая форма
3) в новой форме мы закрепляем первую форму через Controls.Add()
4) Отображаем вторую форму в нужный нам момент

В чем проблема
При вызове Show() для второй формы функция Show() перебирает все закрепленные в ней контролы и устанавливает visible в true. Но так как первая форма создана в другом потоке, то изменение этого свойства не потокобезопасно для первой формы. Если же вызывать Show() в потоке первой формы то это не потокобезопасно для второй формы. Вот делема такая.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
17.02.2012, 22:36
Цитата Сообщение от 444866 Посмотреть сообщение
для второй формы функция Show() перебирает все закрепленные в ней контролы
Это самописный метод Show()?

Цитата Сообщение от 444866 Посмотреть сообщение
3) в новой форме мы закрепляем первую форму через Controls.Add()
Я не понимаю, зачем именно так "закреплять"? Этого вообще помоему нельзя делать.
0
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
17.02.2012, 22:47  [ТС]
Это самописный метод Show()?
Нет самый что ненаесть стандартный

Я не понимаю, зачем именно так "закреплять"? Этого вообще помоему нельзя делать.
Нет ну я уж не знаю что тут и ответить. Формы вполне хорошо закрепляются в других формах. Просто с многопоточностью тут проблемы вот такие. А закреплять мне надо чтобы я не мог ее вытащить за пределы формы в которой я закрепляю. это как минимум.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
18.02.2012, 00:16
Так речь о MDI, так сразу и надо было с этого начинать.

Добавлено через 3 минуты
Судя по тексту исключения, похоже нельзя:
Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке.
Имя параметра: value
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            IsMdiContainer = true;
        }
 
        private void CreateNewForm()
        {
            Form2 form = new Form2(this);
            form.ShowDialog();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Thread thr = new Thread(new ThreadStart(CreateNewForm));
            //thr.SetApartmentState(ApartmentState.STA);
            thr.Start();
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public partial class Form2 : Form
    {
        Form1 _mainForm;
 
        public Form2(Form1 mainForm)
        {
            InitializeComponent();
            _mainForm = mainForm;
            Load += new EventHandler(Form2_Load);
            
        }
 
        void Form2_Load(object sender, EventArgs e)
        {
            Invoke(new Action(() => _mainForm.MdiParent = this));
        }
    }
Добавлено через 1 час 4 минуты
Цитата Сообщение от 444866 Посмотреть сообщение
Нет ну я уж не знаю что тут и ответить. Формы вполне хорошо закрепляются в других формах.
Да не закрепляются формы в других формах. Без потоков тоже ничего не работает по приведённому тобой ранее коду.
0
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
18.02.2012, 00:18  [ТС]
Нет не MDI. И формы закрепляются прекрасно. только надо сначала выставить TopLevel=false для закрепляемой формы. у меня все работало и закреплялось пока потоки не разделил.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
18.02.2012, 00:30
Мне кажется должно быть другое решение. А если всё-таки всё реально
завязано на форме
я представляю это так - вся логика в методах на форме и почти в каждом методе взаимодействие с формой
, то нужно разделить логику с взаимодействием с формой, ну и писать асинхронное выполнение долгосрочных операций. Хотя может я не так всё себе представляю, как он там на самом деле...

Добавлено через 1 минуту
Цитата Сообщение от 444866 Посмотреть сообщение
И формы закрепляются прекрасно. только надо сначала выставить TopLevel=false для закрепляемой формы. у меня все работало и закреплялось пока потоки не разделил.
А да, проверил, и вправду работает. Просто таким не пользовался ранее никогда и не знал.

Добавлено через 4 минуты
Вот:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public partial class Form1 : Form
    {
        public static Form1 Instance { get; private set; } //ну грубо
        Thread thr;
 
        public Form1()
        {
            InitializeComponent();
            Instance = this;
            TopLevel = false;
            thr = new Thread(new ThreadStart(CreateNewForm));
            thr.Start();
        }
 
        static void CreateNewForm()
        {
            Form2 form = new Form2();
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            Form1.Instance.Invoke(new Action<Form1>((form) =>
                {
                    Controls.Add(form);
                    Show();
                }), Form1.Instance);
        }
    }
Добавлено через 4 минуты
Помоему толку от этого ноль.
Вот судя по зависанию основного окна:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            Shown += (s, e) => Thread.Sleep(4000);
            Form1.Instance.BeginInvoke(new Action<Form1>((form) =>
                {
                    Controls.Add(form);
                    Show();
                }), Form1.Instance);
        }
 
    }
1
-1 / 3 / 0
Регистрация: 11.01.2012
Сообщений: 267
18.02.2012, 00:54  [ТС]
Мда тяжелый у меня случай. Но что поделать то. Все завязано на форме жоще некуда. В наследнике от Game переопределяются методы из Game а он сам там у себя внутри их уже вызывает. С того потока с которого сделана форма будет все вызывать, поэтому перенести никак не выйдет.

У меня тоже окно после Show зависает кстате. Не зависает только с BeginInvoke. но и толку нету понятно дело. видимо его напрягает то что разнопоточные контролы приходится показывать в одном методе
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.02.2012, 00:54
Помогаю со студенческими работами здесь

QSqlDatabase к одной базе из разных потоков
У меня многопоточное приложение. В одном потоке (главном) я соединяюсь с некоторой базой данных и с ней работаю (чтение) Есть еще один...

Открытие разных вкладок в одной форме
буду очень признателен, подскажите, как сделать гиперсылку. Имеется одна открытая форма, в ней имееются де вкладки. Как сделать, чтобы...

Анимация разных Image на одной форме
Добрый вечер. Прошу помощи с анимацией картинок на форме. Сама проблема: Есть форма на которой через таймер организован показ картинок. А...

Просмотр на одной форме из 5 таблиц на разных формах
День добрый. помогите, пожалуйста, немного туплю. суть такова: имеется бд состоящая из главной таблицы и 5 дополнительных, необходимо при...

CF 7. Два разных кнопки submit в одной форме
С помощью фильтра add_filter( 'wpcf7_before_send_mail', 'wpcf7_before_send_mail_start_function' ); я могу после отправки письма совершать...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru