Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Skoloss
0 / 0 / 0
Регистрация: 29.12.2013
Сообщений: 10
#1

Как из потока управлять формой, если функции потока находятся в другом классе?

27.02.2015, 00:57. Просмотров 465. Ответов 3
Метки нет (Все метки)

Добрый вечер.
Возник такой вопрос, никак не могу разобраться. Как из потока управлять формой, если функции потока находятся в другом классе?

Сам класс формы из студии, пускай на нем есть Label1 c текстом 0

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public partial class Form1 : Form
{
private works work = new works();
 
 
private void button1_Click(object sender, EventArgs e)
{
 
//запуск потока
thr = new Thread(() => work.change("12345"));
thr.Start();
}
 
}
есть класс works

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class works
{
Form1 form;//как здесь правильно инициализировать класс? ошибка: Делегат метода экземпляра не может иметь нулевым 'this'.
 
public event Action<string> chan;
 
public void change(string text)
{
chan += change;
 
Action act = () =>
            {
                form.Label1.Text = text;
            };
            if (InvokeRequired)
                Invoke(act);
            else act();
}
 
}
Сюда писал код по памяти. Возможно допустил ошибку.
Если инициализировать private Form1 form1 = new Form1(); то выдает ошибку
Необработанное исключение типа "System.StackOverflowException" произошло в WindowsFormsApplication1.exe

как мне побороть эту проблему?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2015, 00:57
Ответы с готовыми решениями:

Как из одного потока узнать состояние другого потока
Подскажите пожалуйста, как из одного потока узнать, что другой поток еще не...

Управление формой из другого потока
народ, киньте пример проекта в котором форма открывается и скрывается из...

Управление формой из потока (изменение прогресса и т.д.)
У меня есть поток, выполняющий длительный процесс, но я не могу реализовать то,...

Закрыть форму с потока созданного этой формой
Доброго времени суток! Есть форма, есть поток со свойством IsBackground = true,...

Записать число в начало потока вернувшись с конца потока после записи нескольких элементов...
public static void Save(List&lt;SomeClass&gt; listSC, String fileName) { ...

3
OwenGlendower
Супер-модератор
Эксперт .NET
8874 / 7876 / 3361
Регистрация: 17.03.2014
Сообщений: 15,530
Записей в блоге: 1
27.02.2015, 04:57 #2
Skoloss, передай форму методу change. Еще бы перенес обновление label из класса works в саму форму, чтобы уменьшить зависимость между ними. Примерно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public interface IForm1
{
    void ChangeText(string text);
}
 
public partial class Form1 : Form, IForm1
{
    private works work = new works();
 
    private void button1_Click(object sender, EventArgs e)
    {
        thr = new Thread(() => work.change(this, "12345"));
        thr.Start();
    }
    
    public void ChangeText(string text)
    {
        if (InvokeRequired())
        {
            label1.Invoke((Action)(() => label1.Text = text));
        }
        else
        {
            Label1.Text = text;
        }
    }
}
 
class works
{
    IForm1 form;
 
    public void change(IForm1 form, string text)
    {
        this.form = form;
        form.ChangeText(text);
    }
}
1
insite2012
Модератор
Эксперт .NET
4825 / 3785 / 1089
Регистрация: 12.10.2013
Сообщений: 11,061
Записей в блоге: 2
27.02.2015, 05:30 #3
Цитата Сообщение от Skoloss Посмотреть сообщение
Как из потока управлять формой
Естественно через события, зачем-то же вы его там создали... Примерно таким образом.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
 
using System.Threading;
 
namespace WindowsFormsApplication1 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            button1.Click += new EventHandler(button1_Click);
        }
 
        void button1_Click(object sender, EventArgs e) {
            Work works = new Work();
            works.getResultEvent += new EventHandler(works_getResultEvent);
            new Thread(() => works.ChangeText("o-lo-lo!")).Start();
        }
 
        void works_getResultEvent(object sender, EventArgs e) {
            string msg = ((Work)sender).Result;
            label1.Invoke((Action)(() => {
                label1.Text = msg;
            }));
        }
    }
    class Work {
        public string Result { get; private set; }
        public event EventHandler getResultEvent = delegate { };
 
        public void ChangeText(string text) {
            Thread.Sleep(5000);
            Result = text.ToUpper();
            getResultEvent(this, EventArgs.Empty);
        }
    }
}
0
Skoloss
0 / 0 / 0
Регистрация: 29.12.2013
Сообщений: 10
27.02.2015, 08:59  [ТС] #4
Спасибо. Понял. Получилось.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2015, 08:59

Обращение к элементу WinForms из потока, отличного от потока, в котором это элемент был создан
Пишу приложение, котором при загрузке формы в textbox на этой форме заносятся...

Обработка запроса на остановку потока внутри этого потока
Нужно обрабатывать запрос на остановку потока внутри самого потока. Вопрос -...

Как управлять динамически созданной формой
static public List&lt;Form&gt; _globalMasive = new List&lt;Form&gt;(); static...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru