powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Создал форму не в главном потоке
37 сообщений из 37, показаны все 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
Создал форму не в главном потоке
    #38131117
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79вопросецзаключается ноу хау? Это стандартные тех возможности :).

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

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

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

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


Может будет интересно для WPF.

Одно приложение, три UI потока, со своим message loop, в каждом потоке по одному окну. кто-то да найдет применение

гавнакодец
MainWindow.xaml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Border Background="Black">
            <Border.Triggers>
                <EventTrigger RoutedEvent="Loaded">
                    <BeginStoryboard>
                        <Storyboard>
                            <ColorAnimation Storyboard.TargetProperty="Background.Color" To="DarkRed" AutoReverse="True" RepeatBehavior="Forever" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </Border.Triggers>
        </Border>
        <Button VerticalAlignment="Center" HorizontalAlignment="Center" Content="Вернуть ID потока" Click="Button_Click_1"/>
    </Grid>
</Window>



MainWindow.xaml.cs
Код: 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.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication4
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(string.Format("{0}", Thread.CurrentThread.Name));
        }
    }
}



Program.cs
Код: 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.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Threading;

namespace WpfApplication4
{
    static class Program
    {
        private static List<Thread> _uiThreads;

        public static void Main()
        {
            _uiThreads = new List<Thread>{
                new Thread(UiThread) { ApartmentState = ApartmentState.STA, Name = "UI1 THREAD" },
                new Thread(UiThread) { ApartmentState = ApartmentState.STA, Name = "UI2 THREAD" },
                new Thread(UiThread) { ApartmentState = ApartmentState.STA, Name = "UI3 THREAD" }
            };

            _uiThreads.ForEach(t => { t.Start(); });
        }

        public static void UiThread()
        {
            var mainWnd = new MainWindow();
            mainWnd.Closed += mainWnd_Closed;
            mainWnd.Show();

            Dispatcher.Run();
        }

        static void mainWnd_Closed(object sender, EventArgs e)
        {
            (sender as MainWindow).Closed -= mainWnd_Closed;

            Dispatcher.ExitAllFrames();
        }
    }
}






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

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

ничего страшного
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131669
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилдве панели - это ни о чём

Видимо вы ни разу не были на всяких ГПЗ и НПЗ, где стоят по три 22-24 монитора у каждого оператора :)

Как правило, нормальные SCADA системы имеют свои GUI разработчики верхнего уровня. В крайнем случае можно прилепить и нечто универсальное типа InTouch и не изобретать велосипед :)
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131678
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LameUser,

может тебе рассказать как как контроллеры видеостен работают?

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

может тебе рассказать как как контроллеры видеостен работают?

3-4 монитора на рабстанцию не требуют никаких программных извращений.

Странный ты, то говоришь что 2 ни о чем, то предлагаешь 3-4. Ты уж определись со своей позицией, либо я не так понял ход твоих мыслей из предложения

Изопропилдве панели - это ни о чём


Про контроллеры видеостен мне неинтересно (зачем мне знать как работает большой телевизор? - мне главное чтобы тех. процесс был автоматизирован правильно и был удобный эргономичный GUI для оператора), а через что будет смотреть оператор тех. процесса на картинку, и уж тем более каким образом формируется изображение на девайсе - мне без разницы. Я конкретно говорил про SCADу верхнего уровня, которая где-то здесь упоминалась в топике.


Изопропил3-4 монитора на рабстанцию не требуют никаких программных извращений.


Так я именно это и имел в виду, когда написал:

LameUserКак правило, нормальные SCADA системы имеют свои GUI разработчики верхнего уровня. В крайнем случае можно прилепить и нечто универсальное типа InTouch и не изобретать велосипед :)
...
Рейтинг: 0 / 0
Создал форму не в главном потоке
    #38131699
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LameUser,

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

что сказать то хотел?

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


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