Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2011, 10:20   #1
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию Потоковая обработка.

Решил разбираться в потоках. Начал с простого: Есть поток, есть текстбокс в другом потоке, добавлять в текстбокс текст из потока. Задача проста, сделал так:
Код:
 public Thread tst;
        public ThreadTest trdtst;
        public delegate void Append(string txt);
        public Append MyDelegate;
        public Form1()
        {
            InitializeComponent();
            button1_Click(this.button1, new EventArgs());
           
            
        }
        public void App(string txt)
        {
            textBox1.AppendText(txt + Environment.NewLine);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MyDelegate = new Append(App);
            trdtst = new ThreadTest(this);
            tst = new Thread(trdtst.Test);
            tst.Start();
            textBox1.AppendText("Потока запущен" + Environment.NewLine);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            trdtst.shouldStop = false;
        }
      
      
    }  
    public class ThreadTest
    {
       

        Form1 frm;
        public bool shouldStop { set; get; }
        public ThreadTest(Form1 form)
        {
             frm = form;
        }
        public void Test()
        {
            shouldStop = true;
            for (int i = 0; i < 10; i++)
            {
                if (shouldStop)
                {
                    if (frm.IsHandleCreated)
                    {
                        if (frm.InvokeRequired)
                        {
                            frm.BeginInvoke(frm.MyDelegate, "From thread "+i.ToString());
                            Thread.Sleep(1000);
                        }
                        else
                            i--;
                    }
                    else
                        i--;
                }
                else { frm.BeginInvoke(frm.MyDelegate, "Stoped"); return; }
            }
        }

    }
Теперь вопрос: Можно ли сделать те же самые действия другим способом. Читал про потоки несколько статей, но другого способа не увидел, а он точно должен быть. Подскажите, где могут быть слабые места этого кода?
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 01.08.2011, 12:53   #2
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Можно через события, т.е. твой поток вызывает некое событие, которое принимается методом в главном (UI-йном) потоке и выполняется. Ищи на форуме, очень много отвечал на такие темы.
Hollander вне форума Ответить с цитированием
Старый 01.08.2011, 17:06   #3
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Hollander, Вы что-то вроде такого имели ввиду?(код не работает,но как пример):
Код:
using System;
using System.Windows.Forms;
using System.Threading;

namespace Test
{
    public partial class UIThread : Form
    {
        Worker worker;

        Thread workerThread;

        public UIThread()
        {
            InitializeComponent();

            worker = new Worker();
            worker.ProgressChanged += new EventHandler<ProgressChangedArgs>(OnWorkerProgressChanged);
            workerThread = new Thread(new ThreadStart(worker.StartWork));
            workerThread.Start();
        }

        private void OnWorkerProgressChanged(object sender, ProgressChangedArgs e)
        {
            //cross thread - so you don't get the cross theading exception
            if (this.InvokeRequired)
            {
                this.BeginInvoke((MethodInvoker)delegate
                {
                    OnWorkerProgressChanged(sender, e);
                });
                return;
            } 

            //change control
            this.label1.Text = e.Progress;
        }
    }

    public class Worker
    {
        public event EventHandler<ProgressChangedArgs> ProgressChanged;

        protected void OnProgressChanged(ProgressChangedArgs e)
        {
            if(ProgressChanged!=null)
            {
                ProgressChanged(this,e);
            }
        }

        public void StartWork()
        {
            Thread.Sleep(100);
            OnProgressChanged(new ProgressChangedArgs("Progress Changed"));
            Thread.Sleep(100);
        }
    }


    public class ProgressChangedArgs : EventArgs 
    {
        public string Progress {get;private set;}
        public ProgressChangedArgs(string progress)
        {
            Progress = progress;
        }
    }
}
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 01.08.2011, 17:25   #4
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Да, все верно
Hollander вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка WM_MOUSEWHEEL Selestis Win Api 7 13.11.2011 16:18
Обработка события Lena220 Microsoft Office Access 2 22.11.2010 11:48
Потоковая передача alexprey Работа с сетью в Delphi 2 16.10.2010 18:55
Потоковая запись в файл yugik Общие вопросы C/C++ 3 08.09.2010 13:21