NetSter
13.04.2010, 15:22
Всем привет.
Не могу въехать в thread-safe and unsafe ways to call a Windows Forms control.
Нужно мне тугому на простом примере показать как это сделать. Для примера возьмем самый примитив. главное понять а дальше уже привинтить что нужно проблем не составит.
Постановка задачи.
Есть форма, на которой кнопка и тексбокс. по нажатию кнопки нужно заполнить текстбокс текстом. раз дело о потоках - соответственно метод заполнения будет в новом потоке) Дальше чуть кода.
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 sender, EventArgs e)
{
textBox1.Text = ("Hello, Antichat!");
}
}
}
либо же вызвать метод
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 sender, EventArgs e)
{
hello();
}
private void hello()
{
textBox1.Text = ("Hello, Antichat!");
}
}
}
все это одно и тоже... смысл не в этом.
мне нужно вызвать метод hello отдельным потоком.
но с потоками я почти не знаком, и теперь начинается все самое веселое.
запускаю поток
private void button1_Click(object sender, EventArgs e)
{
Thread privet = new Thread(hello);
privet.Start();
}
private void hello()
{
textBox1.Text = ("Hello, Antichat!");
}
и что имеем...
ОШИБКА Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "textBox1" не из того потока, в котором он был создан.
ну суть ошибки как бы ясна. исправить ее только не получается у меня)
Может кто распишет этот примитив для меня, чтобы разобраться можно было)
задача та же - просто заполнить текстбокс с другоо потока.
Не могу въехать в thread-safe and unsafe ways to call a Windows Forms control.
Нужно мне тугому на простом примере показать как это сделать. Для примера возьмем самый примитив. главное понять а дальше уже привинтить что нужно проблем не составит.
Постановка задачи.
Есть форма, на которой кнопка и тексбокс. по нажатию кнопки нужно заполнить текстбокс текстом. раз дело о потоках - соответственно метод заполнения будет в новом потоке) Дальше чуть кода.
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 sender, EventArgs e)
{
textBox1.Text = ("Hello, Antichat!");
}
}
}
либо же вызвать метод
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 sender, EventArgs e)
{
hello();
}
private void hello()
{
textBox1.Text = ("Hello, Antichat!");
}
}
}
все это одно и тоже... смысл не в этом.
мне нужно вызвать метод hello отдельным потоком.
но с потоками я почти не знаком, и теперь начинается все самое веселое.
запускаю поток
private void button1_Click(object sender, EventArgs e)
{
Thread privet = new Thread(hello);
privet.Start();
}
private void hello()
{
textBox1.Text = ("Hello, Antichat!");
}
и что имеем...
ОШИБКА Недопустимая операция в нескольких потоках: попытка доступа к элементу управления "textBox1" не из того потока, в котором он был создан.
ну суть ошибки как бы ясна. исправить ее только не получается у меня)
Может кто распишет этот примитив для меня, чтобы разобраться можно было)
задача та же - просто заполнить текстбокс с другоо потока.