Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
87 / 55 / 15
Регистрация: 01.10.2010
Сообщений: 492

Обработка событий дочерних потоков в главном потоке

18.02.2015, 01:34. Показов 3906. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Многопоточное приложение

C#
1
2
Thread thread = new Thread(Start);
thread.Start(port);
Можно ли так сделать?
Генерируем событие в Start и обрабатываем в главном потоке. Если да, то как?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.02.2015, 01:34
Ответы с готовыми решениями:

А можно ли в одном приложении иметь в главном окне несколько дочерних с OpenGL?
А можно ли в одном приложении иметь в главном окне несколько дочерних с OpenGL? Добавлено через 43 минуты И как это сделать?

Создание формы в главном потоке программы
Доброго времени суток, есть необходимость нарисовать форму для управления некоторыми действиями в другой программе. Есть возможность...

Как вызвать метод в главном потоке?
Как вызвать метод в главном потоке? Например у меня по таймеру запускается AudioSource, но просит вызвать его в главном потоке. Можно...

6
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18278 / 14201 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
18.02.2015, 03:54
MDmitry_, если у тебя GUI приложение, то передавай методу Start еще SynchronizationContext.Current, а внутри потока вызывай метод Send у контекста. Для других типов приложений понадобится создать собственный контекст. Пример смотри в Await, SynchronizationContext, and Console Apps. В аттачменте пример из этой статьи.
Вложения
Тип файла: zip AsyncPump.zip (1.2 Кб, 16 просмотров)
1
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
18.02.2015, 07:29
Передачу сообщений можно реализовать с помощь паттерна Messenger (а конкретно библиотеки MvvmLight)

Подписка на событие в главном потоке:
C#
1
2
3
4
Messenger.Default.Register<string>(this, "token1", (x) =>
            {
                Console.WriteLine(x);
            });


Отправка сообщения из фонового:
C#
1
2
3
4
5
 
            Task.Factory.StartNew(() =>
            {
                Messenger.Default.Send<string>("Hello world","token1");
            })
Плюс такого подхода, что не два объекта не знают друг о друге ничего.
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.02.2015, 09:03
Цитата Сообщение от MDmitry_ Посмотреть сообщение
Генерируем событие в Start и обрабатываем в главном потоке. Если да, то как?
Простое событие (если надо, со своим типом аргумента), и не надо ничего больше.
0
87 / 55 / 15
Регистрация: 01.10.2010
Сообщений: 492
18.02.2015, 11:42  [ТС]
Цитата Сообщение от insite2012 Посмотреть сообщение
Сообщение от MDmitry_ Посмотреть сообщение
Генерируем событие в Start и обрабатываем в главном потоке. Если да, то как?
Простое событие (если надо, со своим типом аргумента), и не надо ничего больше.
приведите пример плиз (не совсем понял как это вообще в коде будет выглядеть)
0
146 / 143 / 32
Регистрация: 21.01.2012
Сообщений: 545
18.02.2015, 12:36
MDmitry_,
C#
1
2
3
var inst = new SomeClass();
inst.SomeEvent+=(o,e)=>{Console.WriteLine("Event raised");}
Task.Factory.StartNew(inst.Start());
Только нужно учитывать что код в обработчике события будет исполняться в другом потоке
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
18.02.2015, 13:03
Цитата Сообщение от MDmitry_ Посмотреть сообщение
приведите пример плиз
Нет проблем. В данном примере при загрузке формы создается экземпляр класса и в нем запускается метод, который и запускает отдельный поток. Форма подписана на события данного класса и выводит в заголовке информацию, которую ей передает экземпляр класса через события.
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
53
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 GUI_Threads {
    public partial class Form1 : Form {
        
 
        public Form1() {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load);
        }
 
        void Form1_Load(object sender, EventArgs e) {
            EventGenerator generator = new EventGenerator();
            generator.threadEvent += new EventHandler<ThreadEventArgs>(generator_threadEvent);
            generator.Start();
        }
 
        void generator_threadEvent(object sender, ThreadEventArgs e) {
            string info = string.Format("Event number {0} from Thread {1}", e.EventCount, e.ThreadID);
            this.Invoke((Action)(() => {
                this.Text = info;
            }));
        }
    }
    public class EventGenerator {
        public event EventHandler<ThreadEventArgs> threadEvent = delegate { };
        public void Start() {
            new Thread(() => {
                for (int i = 0; i < 10; i++) {
                    threadEvent(this, new ThreadEventArgs(Thread.CurrentThread.ManagedThreadId, i));
                    Thread.Sleep(1000);
                }
            }){IsBackground = true}.Start();
        }
    }
    public class ThreadEventArgs : EventArgs {
        public readonly int ThreadID;
        public readonly int EventCount;
        public ThreadEventArgs(int id, int count) {
            ThreadID = id;
            EventCount = count;
        }
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.02.2015, 13:03
Помогаю со студенческими работами здесь

Как запустить метод в главном потоке из не главного потока?
Прив. У меня такая трабла, пишу клиент, для игры на одном движке, и если от сервера пришла какая-то определенная инфа, то мне необходимо...

Unity C#. Вызов события в главном потоке из вторичного потока
Здравствуйте. Столкнулся с проблемой при написании простой мультиплеерной игрушки. Я вызываю асинхронный метод UdpClient'а BeginRecieve. В...

Вызвать функцию в главном потоке приложения (в цикле формы)
Есть необходимость в вин формс приложении вызвать делегат в цикле самого приложения. Таскать какой-либо контрол в через глубокие дебри...

Распараллеливание: код выполняется еще медленнее чем в одном главном потоке
Здравствуйте! Хочу сделать распараллеливание участка кода, а именно этого: for (int i = 0; i &lt; mas.length; i++) ...

Thread.Sleep в главном потоке или как сделать нормальную задержку
Здравствуйте, мне нужно сделать задержку, хотелось бы через Thread.Sleep, но использование его в UI-потоке, как известно, приводит к...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru