Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 16.06.2011
Сообщений: 32
1
.NET 4.x

Доступ к GUI из метода другого класса запущенного в фоновом потоке

08.08.2012, 17:25. Показов 1573. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
С доступом к win форме из фонового потока все понятно. Разобрался и с доступом к форме из другого класса. А если эти две задачи объединить, то получиться следующая задача - Как получить доступ к форме из метода другого класса, запущенном в фоновом потоке?
Программа следующая.
1. Значение аргумента определяется рандомно от 0 до 100.
если < 50, то в основном потоке выводим в richTextBox1 текст "основной поток".
иначе

2. запускается в потоке метод Run(sting s) класса threadClass, в который передается значение string s = "фоновый".

3. В свою очередь метод Run, запущенный в фоновом потоке, запускает метод msg(string s) класса Form1, который выполняет вывод значения s в richTextBox1.

код:
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
43
44
45
46
47
48
49
50
51
52
public partial class Form1 : Form
    {
        
        public delegate void msg_delegate(string s);
        threadClass t = new threadClass();
        
        public Form1()
        {
            InitializeComponent();
            t.NewEvent += new threadClass.NewHandler(msg);
        }
 
        //метод для вывода сообщения в richTextBox1, запускается в фоновом потоке
        public void msg(string s)
        {
            msg_delegate msg_del = new msg_delegate(msg);
 
            if (richTextBox1.InvokeRequired) this.Invoke(msg_del, new object[] { s });
            else richTextBox1.AppendText("\nпоток: " + s);
                
            }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            string s;
            threadClass t = new threadClass();
            msg_delegate msg_del = new msg_delegate(t.run);
            Random r = new Random();
            
            if (r.Next(0,100)<50) 
            {
                richTextBox1.AppendText("\nпоток: основной");
            }
            else
            {
                s = "фоновый";
                msg_del.Invoke(s);
            }
        }
    }
 
    public class threadClass
    {
        public delegate void NewHandler(string s);
        public event NewHandler NewEvent;
        
        public void run(string s)
        {
            NewEvent(s);            
        }
    }

В последней строке "NewEvent(s) " возникает ошибка - Null reference exeption...
Чего делаю не так?
Выслушаю любые комментарии...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.08.2012, 17:25
Ответы с готовыми решениями:

Вернуть значение из метода запущенного в потоке (Thread)
Добрый день, создал поток и стартую его. Он находится в одном проекте, обращаюсь к методу из...

Запуск метода в основном потоке из другого
Есть код: class AnotherClass { public EventWaitHandle wh = new...

Каким образом можно из метода одного класса, вывести в метод другого класса текст всплывающего сообщения
Доброе время суток! Есть метод отрисовки всплывающего сообщения public void SetBalloonTip()...

Вызов метода из другого класса, при этом нельзя создать объект второго класса и метод не статический
У меня есть 2 класса - один с формой и кнопкой на ней и другой класс, у которого есть метод void...

2
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
08.08.2012, 18:06 2
Поставитье отладчиком точку останова и посмотрите, где у вас там null.
0
Неадекват
1492 / 1230 / 246
Регистрация: 02.04.2010
Сообщений: 2,789
08.08.2012, 18:08 3
Ух, щас лекцию прочитаю.

Ошибка возникает потому что никто не подписан на это событие.
Рассмотрим код без синтаксического сахара. Т.е. вот это:
C#
1
2
3
4
5
6
7
public delegate void NewHandler(string s);
        public event NewHandler NewEvent;
        
        public void run(string s)
        {
            NewEvent(s);            
        }
На самом деле выглядит примерно так (грубое приближение, но для понимания сойдет):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public delegate void NewHandler (string s);
             private NewHandler  _NewEvent;
             public void add_NewEvent(NewHandler  value)
             {
                    _NewEvent = (NewHandler)Delegate.Combine(_NewEvent, value);
             }
             public void remove_NewEvent(NewHandler  value)
             {
                    _NewEvent = (NewHandler)Delegate.Remove(_NewEvent, value);
             }
             public void run(string s) {
                     _NewEvent(s)
             }
Соответственно до вызова Delegate.Combine у вас NewEvent равен null, о чем заботливо и сообщает студия. Т.е. после создания класса нужно сначала подписаться на событие, а затем только вызывать метод run.

В приведенном же коде, ошибка заключается в создании нового экземпляра threadClass в 27 строке. На этот экземпляр никто не подписан - соответственно ловим null.
0
08.08.2012, 18:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2012, 18:08
Помогаю со студенческими работами здесь

Биндинг в потоке: поток не может получить доступ к интерфейсу из другого потока
модераторам: тема про C# а не UI, так что не переносите &gt;.&lt; Вопрос к знатокам как сделать биндиг...

Запуск метода из другого класса в потоке
Доброго времени суток форумчане. Окажите пожалуйста содействие постигающим, так сказать. Код с...

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

Экземпляр класса как входные данные метода другого класса
Можно ли в качестве входных данных метода передать экземпляр метода другого класса? Если да, то как?


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru