Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Создание элементов управление в главном потоке.


Автор: ajunta 15.8.2008, 11:19
Здравствуйте!

Есть задача - выполнить определенной действие, затем создать на главной форме элементы управления, информирующие об окончании этого действия.

Создание всех элементов управления вынесено в отдельный метод:
Код

        public void CreateObjects()
        {
            System.Windows.Forms.Label MyLabel = new Label();
            MyLabel.Parent = this;
            MyLabel.Top = 100;
            MyLabel.Left = 100;
            MyLabel.Width = 100;
            MyLabel.Height = 100;
            MyLabel.Text = "End of thread!!";
            MyLabel.Show();
        }


далее создаю поток:

Код


        private Thread ProgressThread = null;

        private void button1_Click(object sender, EventArgs e)
        {
            ProgressThread = new Thread(new ThreadStart(Progress));
            ProgressThread.Start();
        }

        public void Progress()
        {
            while (true)
            {
                System.Threading.Thread.Sleep(10);
                int val = progressBar1.Value + 1;
                if (val > 100) break;
                progressBar1.Value = val;                
            }
            CreateObjects();
        }


и как только он вызывает CreateObjects() получаю ошибку: "Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке."

вот собственно и вопрос как это обойти? модго ли например из дочернего потока сказать основному, что бы он выполнил от себя CreateObjects(), дождаться завершения и уже потом просто обращаться к свойстввам созданных объектов.?

Автор: Dray 15.8.2008, 11:29
http://rsdn.ru/article/dotnet/multithrwinfrms.xml

Там нужно прочитать про BeginInvoke. Методы, которые что либо делают с формой и её контролами нужно вызывать из её потока, как раз с помощью инвоков.

Добавлено через 2 минуты и 25 секунд
вот ещё http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

Автор: Partizan 15.8.2008, 11:33
ajunta, 

Код

this.Invoke(
        delegate()
         {
            System.Windows.Forms.Label MyLabel = new Label();
            MyLabel.Parent = this;
            MyLabel.Top = 100;
            MyLabel.Left = 100;
            MyLabel.Width = 100;
            MyLabel.Height = 100;
            MyLabel.Text = "End of thread!!";
            MyLabel.Show();
         }
);

Автор: ajunta 15.8.2008, 13:24
Спасибо! в своем примере разобрался! ))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)