Многопоточность в С#
т.е. необходимо в таймере постоянно проверять переменную?
Необходимо обратиться из вторичного потока к объекту из главного (а именно выводить на форму инфу).. Как это реализовать?
(Если ещё более конкретно, то надо из вторичного потока выводить текст в textBox). Спасибо заранее.
Указатель на textBox передаю. Проблема в том, что возникает еррор во вторичном потоке в строке
MyTextBox.Text = "lalala";
Говорит, что не может обратиться к объекту из другого потока.
"Cross-thread operation not valid: Control 'MyTextBox' accessed from a thread other than the thread it was created on."
MyTextBox.Text = "lalala";
Говорит, что не может обратиться к объекту из другого потока.
"Cross-thread operation not valid: Control 'MyTextBox' accessed from a thread other than the thread it was created on."
Это майкрософтовцы на мой взгляд перемудрили с безопасностью винды. Используй метод Invoke, своей формы.
Example:
//Method working in another thread
................
this.Invoke(new MethodInvoker(UpdateLabel),/*some text*/);
.................................................
private void UpdateLabel(string str)
{
this.TextBox1.Text = str;
}
Отнюдь. Позволяет избежать офигенного багодрома, связанного с кросс-потоковым доступом к объектам.
В классе Thread в Delphi, помнится, был специальный метод (Synchronize) для вызова методов, модифицирующих оконные объекты (происходила синхронизация с главным потоком проиложения, в контексте которого создавались формы).
Что-то я не очень понял как работать с этим методом :( Не мог ли привести более подробный пример...
Для моего кода:
{
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"; //здесть происходит еррор
}
}
Для моего кода:
{
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"; //здесть происходит еррор
}
}
{
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;
}
}
Для моего кода:
{
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"; //здесть происходит еррор
}
}
А можно вот так:
{
private delegate void CodeBlock();
public void Edit(RichTextBox rtb)
{
rtb.Invoke((CodeBlock)delegate {
rtb.Text = "lala";
});
}
}