none
C# взаимодействие потока в компонентами формы RRS feed

  • Вопрос

  • Здравствуйте.

    Имею форму с компонентами.

    Создал дополнительный класс для потока но надо из другого класса получить значение компонента labe4 но не могу понять как.

    Вот мой код:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace PhoneGenerator
    {
      
        public partial class Form1 : Form
        
        {
            
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Worker worker = new Worker();
            }
    
        }
        class Worker
        {
            
            private int value = 0;
            private object valueLocker = new object();
    
            public string rnd ()
            {
                Random rand = new Random(); 
                return rand.Next(0, 9).ToString();
            }
    
            //Метод запускающий потоки
            public void Run()
            {
                for (int i = 0; i < 4; ++i)
                {
                    Thread thread = new Thread(ThreadFunction);
                    thread.Start();
                }
            }
    
            private void ThreadFunction()
            {
                //Блокируем доступ к локеру
                lock (valueLocker)
                {
                    //Выводим значение value
                    Console.WriteLine(value);
                    //Увеличиваем его на единицу
                    ++value;
                }
            }
        }
    }
    

Ответы

  • 1. Обращаться к элементам формы из другого потока нельзя.

    2. Операция new создает новый объект, никак не связанный с главной формой приложения.

    Вывод: передайте объект формы конструктору класса Worker. В функции потока вызывайте методы формы только в потоке формы. См. метод Invoke.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

Все ответы

  • Ваш вопрос не понятен. В приведённом коде ни поток не запускается, ни обращения к элементам формы нет. Подробнее, пожалуйста.

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

  • Ну я убрал сам просто, забыл вернуть. Изменение  в коде вот такой:

     private void button1_Click(object sender, EventArgs e)
            {
                Worker worker = new Worker();
                worker.run();
            }

    А что мне надо именно:

    что бы после 

    private void ThreadFunction() {

    я мог узнать значение компонента numericUpDown2 из формы.

    Сейчас в Form1.cs создал вот такое чудо

    public int cells()
            {
                return Convert.ToInt32(numericUpDown2.Value);
            }

    А в 

    class Worker

    пробовал сделать так

    Form1 frm1 = new Form1();

    и frm1 не даёт никаких наводок по frm1.cells

  • 1. Обращаться к элементам формы из другого потока нельзя.

    2. Операция new создает новый объект, никак не связанный с главной формой приложения.

    Вывод: передайте объект формы конструктору класса Worker. В функции потока вызывайте методы формы только в потоке формы. См. метод Invoke.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!