Многопоточное приложение

  • Автор темы Your_Princess
  • Дата начала
Y

Your_Princess

Гость
#1
Пишу такой код:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace Threads
{

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void RunSecondThread()
{
for (int count = 0; count <= 20; count++)
{
listBox1.Items.Add(count);
Thread.Sleep(50);
}
}

private void button1_Click(object sender, EventArgs e)
{
Thread thrd = new Thread(new ThreadStart(this.RunSecondThread));
thrd.Start();

}



private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
textBox1.Text = radioButton1.Text;
}

private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
textBox1.Text = radioButton2.Text;
}

private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
textBox1.Text = radioButton3.Text;
}
}



}

ОН компилируется, но во время выполнения выдаёт такую ошибку:

Cross-thread operation not valid: Control 'listBox1' accessed from a thread other than the thread it was created on.

на строке listBox1.Items.Add(count);

И я вот никак не пойму как сделать это правильно.
Помогите пожалуйста.
 
F

Fazil

Гость
#3
Я вставил код компилировал, все отлично работает. Может это от версий компилятора. Я исползую ВС.НЕТ 2005. И я убрал последний 3 метода(радиобаттон).
 
F

f.7

Гость
#4
Для: Fazil
karlito всё правильно сказал, я всех тонкостей не знаю, но знаю что из другого потока контролы плохо себя ведут :blink:, (тоесть нельзя там присвоить текст и всё такое), но товарищи из Microsoft`а предусмотрели обходной путь :), надо через делегат, ниже код - должен палить
Код:
using System.Threading;

namespace Tread
{
public partial class Form1 : Form
{
[u]delegate void SetTextCallback();[/u]
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
Thread demoThread = null;
demoThread = new Thread(new ThreadStart(this.ThreadProcSafe));
demoThread.Start();
MessageBox.Show("Поток запущен");
}

private void ThreadProcSafe()
{
this.SetText();
}
private void SetText()
{
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d);
}
else
{
for (int i=0; i<2000; i++)
{
this.textBox1.Text = i.ToString();
this.Update();
}
}
}
}
}