Передача сигнала из потока в GUI - C#
Формулировка задачи:
Проблема собственно вот в чем, программирую на С++, но вот начал интерисоваться C# и очень увлекся, вот пробую первые шаги делать в нем, язык вроде не сложный, но так как привычки в С++ такие как указатели на функцию и прочее остались, то в некоторых моментах освоиться сложновато...
так вот сделал GUI окно с текстовым редактором в который из потока что нить должно написаться, к примеру запустил я цикл долгий в потоке, и тот каждую итерапцию дожен передать значение переменной на textBox
вот собственно что налепил
и вот сам поток
Никак не пойму почему в консоле выводится то что пришло из потока, а в textBox1 нифига не хочет... Или я делегатов неправильно записал или вообще по другому нужно делать????
namespace Exemple1_Threads_Window
{
public partial class Form1 : Form
{
object lockOn = new object();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
showText("Программа запущена!");
int threadsNumber = 1;
MyThread[] thread = new MyThread[threadsNumber];
for (int i = 0; i < threadsNumber; i++)
{
thread[i]= new MyThread("MyThread", i + 1);
thread[i].Start();
}
}
public void showText(string str)
{
lock (lockOn)
{
Console.WriteLine(str);//вот здесь выводится в консоль str пршедшее из потока
textBox1.AppendText(str); //тут никакой реакции
textBox1.AppendText("qqq"); //это добавляет в textBox1 надпись нормально
}
}
}
}using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace Exemple1_Threads_Window
{
delegate void showT(string str);
class MyThread
{
public int numberThread;
public string nameThread;
Form1 form;
public event showT showTextEvent;
public MyThread(string nameThread, int numberThread)
{
this.numberThread = numberThread;
this.nameThread = nameThread;
form = new Form1();
showTextEvent = form.showText;
}
public void Start()
{
Thread newThread = new Thread(Run);
try
{
newThread.Start();
}
catch (ThreadAbortException ex)
{
Console.WriteLine(ex.ToString());
}
}
public void Run()
{
Console.WriteLine(nameThread + " начат поток номер№" + numberThread + "\n");
try
{
showTextEvent("Potok #" + numberThread);
}
catch(Exception ex)
{
Console.Write(ex.ToString());
}
}
}
}Решение задачи: «Передача сигнала из потока в GUI»
textual
Листинг программы
public void showText(string str)
{
lock (lockOn)
{
Console.WriteLine(str);//вот здесь выводится в консоль str пршедшее из потока
/*!*/ //textBox1 находится в другом потоке, поэтому необходимо использовать Invoke
Invoke(new Action(delegate
{
textBox1.AppendText(str); //тут никакой реакции
textBox1.AppendText("qqq"); //это добавляет в textBox1 надпись нормально
}));
}
}