none
Как создать поток RRS feed

  • Вопрос

  • Добрый вечер.

    Пытаюсь прояснить для себя, что такое поток. Написал код и пытаюсь получить слово поток в <textbox> n-ое количество раз. Что-то я делаю не так. Появляется слово <поток> только один раз.

    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;
    using System.Threading;
    
    
    namespace WindowsFormsApplication1
    {
      public partial class Form1 : Form
      { 
        public Form1()
        {
          InitializeComponent();
          Thread firstthread = new Thread(new ThreadStart(this.Potok));
          firstthread.Start();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
          
        }
        private void Potok()
        {
          while (true)
          {
            textBox1.Text = "Поток";
          }  
        }
      }
    }
    

    Похожие темы не загружаются вот и создал тему. 

     

    22 октября 2010 г. 15:15

Ответы

  • Кроме += есть еще пару неприятных ошибок.
    • Поток ты запускаешь слишком рано. Дождись хотя бы загрузки формы
    • Поток очень агрессивно меняет текст, не делая даже малейшей задержки. Добавь Thread.Sleep();
    • Если не предусматриваешь корректное завершение потока – пометь его как background, чтобы он не мешал приложению завершиться.
    • Не работай из потоков с формой напрямую. Это верный способ получить исключение “cross thread operation not valid”. Перекидывай работу с контролами в главный поток через Invoke.
    Как-то так:
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Thread firstthread = new Thread(new ThreadStart(this.Potok));
        firstthread.IsBackground = true;
        firstthread.Start();
    }

    private void Potok()
    {
        while (true)
        {
            this.Invoke(new MethodInvoker(() =>
                textBox1.Text += "Поток"
                ));
            Thread.Sleep(1000);
        }
    }

    • Предложено в качестве ответа ulcerModerator 23 октября 2010 г. 5:07
    • Помечено в качестве ответа hochuznat 25 октября 2010 г. 5:45
    22 октября 2010 г. 17:46

Все ответы

  • Смотри =)

    У тебя написано

    textBox1.Text = "Поток";

    Ты не добавляешь к уже существующему тексту в текстбоксе новый текст, а полностью его заменяешь.Если хочешь, чтобы текст добавлялся, то замени на такой код:

    textBox1.Text += "Поток";

    Те теперь, к тому что уже содержится в текстбоксе, будет добавлен новый текст.


    E-mail: Svatoslav.Pankratov@gmail.com
    22 октября 2010 г. 15:42
  • Кроме += есть еще пару неприятных ошибок.
    • Поток ты запускаешь слишком рано. Дождись хотя бы загрузки формы
    • Поток очень агрессивно меняет текст, не делая даже малейшей задержки. Добавь Thread.Sleep();
    • Если не предусматриваешь корректное завершение потока – пометь его как background, чтобы он не мешал приложению завершиться.
    • Не работай из потоков с формой напрямую. Это верный способ получить исключение “cross thread operation not valid”. Перекидывай работу с контролами в главный поток через Invoke.
    Как-то так:
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Thread firstthread = new Thread(new ThreadStart(this.Potok));
        firstthread.IsBackground = true;
        firstthread.Start();
    }

    private void Potok()
    {
        while (true)
        {
            this.Invoke(new MethodInvoker(() =>
                textBox1.Text += "Поток"
                ));
            Thread.Sleep(1000);
        }
    }

    • Предложено в качестве ответа ulcerModerator 23 октября 2010 г. 5:07
    • Помечено в качестве ответа hochuznat 25 октября 2010 г. 5:45
    22 октября 2010 г. 17:46
  • Доброе утро.

    Спасибо за такой ответ. Это лучше, чем ничего.

    Удачи всем.

    25 октября 2010 г. 5:48