Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Многопоточность в С#

370
12 ноября 2007 года
koval
443 / / 29.08.2005
Люди добрые подскажите решение проблеммы. Есть основной поток который создает вторичный поток, который выполняет некоторые действия, по завершению потока надо сообщить главному потоку что все действия выполнены, при этом основной поток блокироваться не должен. Как это возможно реализовать? Можно просто идеи без кода.
240
12 ноября 2007 года
aks
2.5K / / 14.07.2006
Эвенты, сообщения, установка логической переменной/вызов метода установящего эту переменную, по значению который первый поток все поймет (регулярно ее проверяя).
370
12 ноября 2007 года
koval
443 / / 29.08.2005
Цитата: aks
Эвенты, сообщения, установка логической переменной/вызов метода установящего эту переменную, по значению который первый поток все поймет (регулярно ее проверяя).



т.е. необходимо в таймере постоянно проверять переменную?

240
12 ноября 2007 года
aks
2.5K / / 14.07.2006
Ну почему обязательно в таймере. У тебя же первый поток тоже чето делает. ну например после очередной итерации каких то осмысленных действий.
370
12 ноября 2007 года
koval
443 / / 29.08.2005
Все большое спасибо разобрался с Events.
25K
15 ноября 2007 года
ЙэвгениЙ
22 / / 19.07.2007
Тоже вопрос возник по поводу многопоточности...
Необходимо обратиться из вторичного потока к объекту из главного (а именно выводить на форму инфу).. Как это реализовать?
(Если ещё более конкретно, то надо из вторичного потока выводить текст в textBox). Спасибо заранее.
240
15 ноября 2007 года
aks
2.5K / / 14.07.2006
В чем проблема? Вызвать метод который это сделает. Главное иметь ссылку/указатель/что угодно на экземпляр того объектра в котором надо чето поменять.
25K
15 ноября 2007 года
ЙэвгениЙ
22 / / 19.07.2007
Цитата: aks
В чем проблема? Вызвать метод который это сделает. Главное иметь ссылку/указатель/что угодно на экземпляр того объектра в котором надо чето поменять.



Указатель на textBox передаю. Проблема в том, что возникает еррор во вторичном потоке в строке
MyTextBox.Text = "lalala";

Говорит, что не может обратиться к объекту из другого потока.

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

370
15 ноября 2007 года
koval
443 / / 29.08.2005
Цитата: ЙэвгениЙ
Указатель на textBox передаю. Проблема в том, что возникает еррор во вторичном потоке в строке
MyTextBox.Text = "lalala";

Говорит, что не может обратиться к объекту из другого потока.

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



Это майкрософтовцы на мой взгляд перемудрили с безопасностью винды. Используй метод Invoke, своей формы.

Example:

Код:
public delegate void MethodInvoker(string str);

//Method working in another thread
................
this.Invoke(new MethodInvoker(UpdateLabel),/*some text*/);

.................................................

private void UpdateLabel(string str)
{
this.TextBox1.Text = str;
}
5
16 ноября 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: koval
Это майкрософтовцы на мой взгляд перемудрили с безопасностью винды.

Отнюдь. Позволяет избежать офигенного багодрома, связанного с кросс-потоковым доступом к объектам.
В классе Thread в Delphi, помнится, был специальный метод (Synchronize) для вызова методов, модифицирующих оконные объекты (происходила синхронизация с главным потоком проиложения, в контексте которого создавались формы).

25K
16 ноября 2007 года
ЙэвгениЙ
22 / / 19.07.2007
Цитата: koval
...Используй метод Invoke, своей формы.



Что-то я не очень понял как работать с этим методом :( Не мог ли привести более подробный пример...
Для моего кода:

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

        private void button1_Click(object sender, EventArgs e)
        {
            SecondThread thr = new SecondThread();
            Thread t = new Thread(delegate() { thr.Edit(richTextBox1); });
            t.Start();
        }          
    }

    class SecondThread
    {
        public void Edit(RichTextBox rtb)
        {            
            rtb.Text = "lala";          //здесть происходит еррор
        }

    }
370
16 ноября 2007 года
koval
443 / / 29.08.2005
Цитата: ЙэвгениЙ
Что-то я не очень понял как работать с этим методом :( Не мог ли привести более подробный пример...
Для моего кода:

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

        private void button1_Click(object sender, EventArgs e)
        {
            SecondThread thr = new SecondThread();
            Thread t = new Thread(delegate() { thr.Edit(richTextBox1); });
            t.Start();
        }          
    }

    class SecondThread
    {
        public void Edit(RichTextBox rtb)
        {            
            rtb.Text = "lala";          //здесть происходит еррор
        }

    }



Код:
class SecondThread
    {
       public delegate void MethodInvokerString(string str);
       .................................

        public void Edit(RichTextBox rtb)
        {            
            this.Invoke(new MethodInvoker(UpdateRichTextBox),rtb);
        }

       void UpdateRichTextBox(string str)
       {
             this.rtb.Text = str;
       }

    }
5
17 ноября 2007 года
hardcase
4.5K / / 09.08.2005
Цитата: ЙэвгениЙ
Что-то я не очень понял как работать с этим методом :( Не мог ли привести более подробный пример...
Для моего кода:

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

        private void button1_Click(object sender, EventArgs e)
        {
            SecondThread thr = new SecondThread();
            Thread t = new Thread(delegate() { thr.Edit(richTextBox1); });
            t.Start();
        }          
    }

    class SecondThread
    {
        public void Edit(RichTextBox rtb)
        {            
            rtb.Text = "lala";          //здесть происходит еррор
        }

    }


А можно вот так:

Код:
class SecondThread
    {

         private delegate void CodeBlock();
        public void Edit(RichTextBox rtb)
        {            
            rtb.Invoke((CodeBlock)delegate {
                rtb.Text = "lala";
            });
        }

    }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог