Передача сигнала из потока в GUI - C#

Узнай цену своей работы

Формулировка задачи:

Проблема собственно вот в чем, программирую на С++, но вот начал интерисоваться C# и очень увлекся, вот пробую первые шаги делать в нем, язык вроде не сложный, но так как привычки в С++ такие как указатели на функцию и прочее остались, то в некоторых моментах освоиться сложновато... так вот сделал GUI окно с текстовым редактором в который из потока что нить должно написаться, к примеру запустил я цикл долгий в потоке, и тот каждую итерапцию дожен передать значение переменной на textBox вот собственно что налепил
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());
                }
        }
    }
}
Никак не пойму почему в консоле выводится то что пришло из потока, а в textBox1 нифига не хочет... Или я делегатов неправильно записал или вообще по другому нужно делать????

Решение задачи: «Передача сигнала из потока в 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 надпись нормально
                }));
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5