Обращение к форме из другого потока - C# (212400)

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

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

Добрый день. Несколько дней не могу решить проблему: Имеется форма. В ней по нажатию кнопки создается отдельный поток, совершающий вычисления.
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Thread newThread = new Thread(new ThreadStart(myClass.thFunc));
            newThread.Start();
 
        }
    }
Вот этот метод находящийся в другом классе:
    class myClass
    {
        public static void thFunc()
        {
            //вычисления
            TableForm TF = new TableForm();
            TF.Show();
            TF.writeTable();
            TF.Update();
        }
    }
ВО ВРЕМЯ вычисления данные должны выводиться в таблицу ДРУГОЙ ФОРМЫ
    public partial class TableForm : Form
    {
        public TableForm()
        {
            InitializeComponent();
        }
 
        public void writeTable()
        {
            for (int i = 0; i < 10;i++ )
            {
                dataGridView1.Rows.Add();
                dataGridView1.Rows[i].Cells[0].Value = i;
                dataGridView1.Update();
                Thread.Sleep(1000);
            } 
        }
    }
Этот код набросал - чтоб показать приблизительную струтуру программы. Проблема в том, что форма с таблицей создана во втором потоке и пользователь во время этого всего процесса не может просмотреть текущую информацию - форма висит. по завершении цикла она сразу же закрывается. не могу догнать, как не создавая форму во втором потоке, можно вызывать ее методы для вывода данных. Надеюсь поняли суть проблемы.

Решение задачи: «Обращение к форме из другого потока»

textual
Листинг программы
    public partial class TableForm : Form
    {
        public TableForm()
        {
            InitializeComponent();
        }
 
        private void AddDataToTable(int data)
        {
            Action addData = new Action(delegate
                {
                    int index = dataGridView1.Rows.Add();
                    dataGridView1.Rows[index].Cells[0].Value = data;
                    dataGridView1.Update();
                });
            if (!dataGridView1.InvokeRequired)
                addData();
            else
                dataGridView1.Invoke(addData);
        }
 
        public void WriteTable()
        {
           //вообще это быстрее работает, чем если создавать новый поток
            ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork)); 
        }
 
        private void DoWork(object unused)
        {
            for (int i = 0; i < 10; i++)
            {
                AddDataToTable(i);
                Thread.Sleep(400);
            }
        }
    }

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


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

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

8   голосов , оценка 3.875 из 5
Похожие ответы