Передача сигнала из потока в 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 надпись нормально })); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д