Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 29.12.2013
Сообщений: 10

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

27.02.2015, 00:57. Показов 1652. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.02.2015, 00:57
Ответы с готовыми решениями:

Как пользоваться событиями или как управлять формой из потока?
Начнем справа налево: Предположим есть поток tr1 и глобальная переменная int i; void tr1(){ while(openMain){ i++; } ...

Вызов функции из потока в другом файле
Здравствуйте! Помогите начинающему. Я создал класс class ExampleA(QMainWindow) и написал функцию, которая автоматически открывает файл...

Как управлять компонентами формы из вторичного потока?
Пытаюсь сделать чтобы во время выполнения цикла ProgresBar показывал продвижения вычислений и все это во вторичном потоке.Выскакивает...

3
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18307 / 14231 / 5368
Регистрация: 17.03.2014
Сообщений: 28,903
Записей в блоге: 1
27.02.2015, 04:57
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
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
27.02.2015, 05:30
Цитата Сообщение от 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
0 / 0 / 0
Регистрация: 29.12.2013
Сообщений: 10
27.02.2015, 08:59  [ТС]
Спасибо. Понял. Получилось.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.02.2015, 08:59
Помогаю со студенческими работами здесь

VC++6.0, как из порожденного потока прочитать переменную главного потока?
Visual C++ 6.0 SP5 Простое диалоговое окно, (MFC) созданное мастером среды VC По нажатию на кнопку создаю поражденный поток, в...

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

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

Потоки. Как из одного потока вызвать выполнение метода в другом потоке
Необходимо 50 раз в секунду выполнять методы в двух параллельно работающих потоках синхронизировано. Для этого я создал третий поток -...

Синхронизация чужого потока с моей формой
Имею DLL, в которую для организации Callback функций отправляю указатель на функцию обратного вызова. procedure...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru