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

Тема в разделе ".NET", создана пользователем Your_Princess, 30 авг 2007.

  1. Your_Princess

    Your_Princess Гость

    Пишу такой код:
    Код (Text):
    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);

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

    karlito Гость

    Главное правило программирование на винде - работай с окном и контролами только в потоке его создавшем.
    Погугли : http://www.google.com/search?q=accessed+fr...amp;rlz=1I7ADBF
    а лучше на этом же форуме поищи.
     
  3. Fazil

    Fazil Гость

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

    f.7 Гость

    Для: Fazil
    karlito всё правильно сказал, я всех тонкостей не знаю, но знаю что из другого потока контролы плохо себя ведут :blink:, (тоесть нельзя там присвоить текст и всё такое), но товарищи из Microsoft`а предусмотрели обходной путь :), надо через делегат, ниже код - должен палить
    Код (Text):
    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();
    }
    }
    }
    }
    }
     
Загрузка...

Поделиться этой страницей