powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создал форму не в главном потоке
25 сообщений из 37, страница 1 из 2
Создал форму не в главном потоке
    #38130969
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пытаюсь выставить свойства компонента в том же потоке что создал (это точно тот поток) и пишет что доступ из потока не в котором создан контрол. Что за байда? Вроде можно ж так.
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38130973
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть id потока в котором был вызов конструктора формы и initializecomponents (здесь как раз создаются) равен тому в котором пытаюсь свойства изменить.
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38130982
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Создал форму не в главном потоке"

А зачем?
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38130989
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79"Создал форму не в главном потоке"

А зачем?
надо. веришь?
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38130998
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSql,

так можно, код кинь.
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131003
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSqlверишь?

Нет, не верю.
Как я понимаю, все формы/контролы и т.п., корочЕ, всё UI, должны создаваться в основном потоке приложения.
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131011
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSql,
авторто есть id потока в котором был вызов конструктора формы и initializecomponents (здесь как раз создаются) равен тому в котором пытаюсь свойства изменить.

нельзя завязываться на id, визически поток (на уровне ОС) поток может быть другим.
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131014
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79FatherSqlверишь?

Нет, не верю.
Как я понимаю, все формы/контролы и т.п., корочЕ, всё UI, должны создаваться в основном потоке приложения.

Технически можно по-разному.
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131020
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросецТехнически можно по-разному

Зачем извращаться то? :-) Пытаться работать с UI в многопоточном режиме, если сама UI этого не поддерживает.

Я всё пытаюсь добиться от ТС объяснения зачем ему это. Может, есть способ сделать правильнее
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131032
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79вопросецТехнически можно по-разному

Зачем извращаться то? :-) Пытаться работать с UI в многопоточном режиме, если сама UI этого не поддерживает.

Я всё пытаюсь добиться от ТС объяснения зачем ему это. Может, есть способ сделать правильнее

Почему? Если у вас есть N потоков, в каждом из которых создана форма, можете обращаться легко и непринужденно из этого потока к соответствующей форме, можно и к другой форме но через InvokeRequired/Invoke

например, работающий случай автора
Код: 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.
34.
35.
36.
37.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Thread _t;
        private void button1_Click(object sender, EventArgs e)
        {
            _t = new Thread(MyProc);
            _t.Start();
        }

        private void MyProc(object obj)
        {
            var myForm = new Form2();

            myForm.SetText("Привет из второго потока");

            myForm.ShowDialog();
        }
    }
}

...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131040
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросецЕсли у вас есть N потоков, в каждом из которых создана форма, можете обращаться легко и непринужденно из этого потока к соответствующей форме, можно и к другой форме но через InvokeRequired/Invoke

Э, а нельзя сделать все формы в одном (основном) потоке, а из вторичных к ним обращаться "через InvokeRequired/Invoke"?
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131044
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

это уже совсем другая история и зависит от задач.
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131045
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросец,
приведенный код помог найти мне ошибку. выражаю благодарность. то есть в принципе все сделал правильно но в одном месте забыл написать в соответствии с последней идеологией (так как когда начинал писать она была другой). А кода было не 2 строки а немного побольше.
Все пашет.
Возможно все.
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131048
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79вопросецЕсли у вас есть N потоков, в каждом из которых создана форма, можете обращаться легко и непринужденно из этого потока к соответствующей форме, можно и к другой форме но через InvokeRequired/Invoke

Э, а нельзя сделать все формы в одном (основном) потоке, а из вторичных к ним обращаться "через InvokeRequired/Invoke"?
можно, но иногда проще по другому.
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131053
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

Например, есть у вас SCADA клиент, два монитора огромных и несколько окон, отображающих разные техпроцессы, и очень много изменений в единицу времени, отчего не взять да и не запилить по потоку на фурму, чтобы не конкурировали. И т. п..
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131055
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
единственное если кто на скору руку может напишите плиз правильный синтаксис создания делегата на лету, то есть чтото типа

control.invoke(new delegate()
{
label.text = "4";
});

это лямбда, думаю понятно что имею ввиду, вроде так просто не работает. Щас буду искать как правильно написать но если напишите раньше то буду премного благодарен.
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131065
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросецArm79,

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

Это стандартная практика? Или ваше ноу-хау?
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131073
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSql,

Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Thread _t;
        private void button1_Click(object sender, EventArgs e)
        {
            _t = new Thread(MyProc);
            _t.Start();
        }

        private void MyProc(object obj)
        {
            while (true)
            {
                var MSG = DateTime.Now.Ticks.ToString();

                if (InvokeRequired)
                    Invoke(new UpdateUiDelegate(UpdateUi), new object[] { MSG });
                else
                    UpdateUi(MSG);
            }
        }

        private delegate void UpdateUiDelegate(string msg);
        private void UpdateUi(string msg)
        {
            label1.Text = msg;
        }
    }
}

...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131077
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

А в чем заключается ноу хау? Это стандартные тех возможности :).
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131082
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросецFatherSql,

+
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Thread _t;
        private void button1_Click(object sender, EventArgs e)
        {
            _t = new Thread(MyProc);
            _t.Start();
        }

        private void MyProc(object obj)
        {
            while (true)
            {
                var MSG = DateTime.Now.Ticks.ToString();

                if (InvokeRequired)
                    Invoke(new UpdateUiDelegate(UpdateUi), new object[] { MSG });
                else
                    UpdateUi(MSG);
            }
        }

        private delegate void UpdateUiDelegate(string msg);
        private void UpdateUi(string msg)
        {
            label1.Text = msg;
        }
    }
}


это как раз геморойная запись, можно сразу на месте писать без промежуточного кода и лишних переменных
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131088
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросецзаключается ноу хау? Это стандартные тех возможности :).

Хм... Буду знать, что еще и так можно применять. Обычно я делал всё UI в основном треде, а из вторичных - нотификацию. Раньше это было через PostMesage. На Net никаких сложных интерфейсов не рисовал, всё как то в одном потоке помещалось :-)
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131101
FatherSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот так вот:

Код: c#
1.
2.
3.
4.
5.
Control.Invoke((MethodInvoker)delegate
{
label.Text = "abc";
}
);
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131105
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FatherSql,

Так прокатит? Invoke(new Action<string>(msg => { label1.Text = msg; }), new object[] { MSG });
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131114
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Invoke(new Action(() => { label1.Text = MSG; }));
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131116
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопросецArm79,

Например, есть у вас SCADA клиент, два монитора огромных и несколько окон, отображающих разные техпроцессы, и очень много изменений в единицу времени, отчего не взять да и не запилить по потоку на фурму, чтобы не конкурировали. И т. п..
пипец....
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создал форму не в главном потоке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]