Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
iga81
0 / 0 / 1
Регистрация: 16.06.2011
Сообщений: 32
1

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

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

С доступом к 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2012, 17:25
Ответы с готовыми решениями:

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

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

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

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

Доступ к свойствам экземпляра класса из другого класса
Здравствуйте! У меня возникла программа с написанием программы на C#. ...

2
SandWraith
189 / 189 / 38
Регистрация: 11.04.2009
Сообщений: 497
Завершенные тесты: 2
08.08.2012, 18:06 2
Поставитье отладчиком точку останова и посмотрите, где у вас там null.
0
freeba
Неадекват
1269 / 1067 / 204
Регистрация: 02.04.2010
Сообщений: 2,454
Записей в блоге: 2
Завершенные тесты: 2
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2012, 18:08

Доступ к переменным другого класса
class Form1: Form { public Class1 cl; public PictureBox pictureBox1; ...

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

Запуск метода в новом потоке
private void Matrix() { for (int y = 0; y &lt; size; y++) ...


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

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

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