PDA

Просмотр полной версии : [help] Потоки и Windows Forms controls


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" не из того потока, в котором он был создан.

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

NetSter
13.04.2010, 15:29
Здесь присутствуют: 10 (пользователей - 1 , гостей - 9)
0_o

Berman
13.04.2010, 15:32
синхронизировать нужно
покрайнеё мере в делфи так

W!z@rD
13.04.2010, 15:45
if (InvokeRequed)
{
BeginInvoke(new MethodInvoker(() => textBox1.Text = "abc")));
}


P.S. тыц (https://forum.antichat.ru/thread169454.html)

NetSter
13.04.2010, 16:10
thx.
Close pls.
ЗЫ\ не видел ту статью, честно :rolleyes: