[help] Потоки и Windows Forms controls

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by NetSter, 13 Apr 2010.

  1. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    809
    Likes Received:
    412
    Reputations:
    62
    Всем привет.
    Не могу въехать в thread-safe and unsafe ways to call a Windows Forms control.
    Нужно мне тугому на простом примере показать как это сделать. Для примера возьмем самый примитив. главное понять а дальше уже привинтить что нужно проблем не составит.

    Постановка задачи.
    Есть форма, на которой кнопка и тексбокс. по нажатию кнопки нужно заполнить текстбокс текстом. раз дело о потоках - соответственно метод заполнения будет в новом потоке) Дальше чуть кода.

    PHP:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

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

            private 
    void button1_Click(object senderEventArgs e)
            {
                
    textBox1.Text = ("Hello, Antichat!");
            }
        }
    }
    либо же вызвать метод

    PHP:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

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

            private 
    void button1_Click(object senderEventArgs e)
            {
                
    hello();
            }

            private 
    void hello()
            {
                
    textBox1.Text = ("Hello, Antichat!");
            }
        }
    }
    все это одно и тоже... смысл не в этом.
    мне нужно вызвать метод hello отдельным потоком.
    но с потоками я почти не знаком, и теперь начинается все самое веселое.
    запускаю поток
    PHP:
    private void button1_Click(object senderEventArgs e)
            {
                
    Thread privet = new Thread(hello);
                
    privet.Start();
            }
    private 
    void hello()
            {
                
    textBox1.Text = ("Hello, Antichat!");
            }
    и что имеем...
    ОШИБКА Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "textBox1" не из того потока, в котором он был создан.

    ну суть ошибки как бы ясна. исправить ее только не получается у меня)
    Может кто распишет этот примитив для меня, чтобы разобраться можно было)
    задача та же - просто заполнить текстбокс с другоо потока.
     
    _________________________
  2. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    809
    Likes Received:
    412
    Reputations:
    62
    Здесь присутствуют: 10 (пользователей - 1 , гостей - 9)
    0_o
     
    _________________________
  3. Refqs

    Refqs Banned

    Joined:
    20 Feb 2010
    Messages:
    139
    Likes Received:
    56
    Reputations:
    27
    синхронизировать нужно
    покрайнеё мере в делфи так
     
  4. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    if (InvokeRequed)
    {
    BeginInvoke(new MethodInvoker(() => textBox1.Text = "abc")));
    }


    P.S. тыц
     
  5. NetSter

    NetSter Moderator

    Joined:
    30 Jul 2007
    Messages:
    809
    Likes Received:
    412
    Reputations:
    62
    thx.
    Close pls.
    ЗЫ\ не видел ту статью, честно :rolleyes:
     
    _________________________