С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160

Многопоточное программирование

19.09.2011, 11:46. Показов 5305. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа выполняется в одном потоке. Есть три обработчика событий. Как сделать так, чтобы каждый обработчик выполнялся в отдельном потоке параллельно с основным потоком? Процессор четырех ядерный.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2011, 11:46
Ответы с готовыми решениями:

Многопоточное программирование
Здравствуйте, читал литературу по C# с целью разобраться как сделать многопоточную программу, но намешал каши в голове. Не могли бы вы...

Асинхронное vs. Многопоточное программирование
Здравствуйте. Изучая темы многопоточности и асинхронного программирования, у меня возник вопрос. В чем разница вызвать метод асинхронно или...

Что такое многопоточное программирование?
Здравствуйте, а можете пожалуйста объяснить чайнику что такое многопоточное программирование, если можно, то с примером на c# Заранее...

12
 Аватар для Neser
93 / 93 / 19
Регистрация: 25.12.2010
Сообщений: 316
19.09.2011, 12:18
C#
1
Thread th = new Thread();
1
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
19.09.2011, 12:24  [ТС]
Цитата Сообщение от Neser Посмотреть сообщение
Thread th = new Thread();
Куда это записать, прямо в обработчик? Нужно ли как-то закреплять каждый поток за отдельным ядром процессора (4 ядра - 1 основной поток, и 3 обработчика) можете пояснить?
0
Заблокирован
19.09.2011, 12:42
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
        public Form1()
        {
            InitializeComponent();
 
            new System.Threading.Thread(() =>
            {
                this.MouseMove += (sender, e) =>
                    {
                        // пиши свой код
                        this.Text = e.X.ToString() + " " + e.Y.ToString();
 
                    };
            }).Start();
 
            // или так. Это зависит надо ли тебе использовать переменную <e> в обработчике события
            new System.Threading.Thread(() =>
            {
                this.Click += delegate
                {
                    // пиши свой код
                    MessageBox.Show("Ку-ку");
 
                };
            }).Start();
        }
Добавлено через 1 минуту
По поводу закрепления потока за выбранным ядром - не в курсах. Походу это решает сама система.
1
 Аватар для umnick_kh
311 / 249 / 44
Регистрация: 06.12.2010
Сообщений: 527
19.09.2011, 12:44
Нет, кол-во потоков не зависит от кол-ва ядер.
Пример:
C#
1
2
3
4
5
6
7
8
        public void Foo()
        {
            MessageBox.Show("PROFIT!!!");
        }
        private void button1_Click(object sender, EventArgs e)
        {
            new Thread(Foo).Start();//MessageBox будет выведен из другого потока.
        }
Без доп. метода:
C#
1
2
3
4
5
6
7
        private void button1_Click(object sender, EventArgs e)
        {
            new Thread(delegate()
                {
                    MessageBox.Show("PROFIT");
                }).Start();
         }
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.09.2011, 12:53
Оставьте распределение по ядрам процессора на совести операционной системы.

C#
1
2
3
4
5
6
7
8
9
10
void Handler(object sender, EventArgs e)
{
   Thread thread = new Thread(MethodThatDoesActualWork);
   thread.Start();
}
 
void MethodThatDoesActualWork()
{
   while (true) { Console.WriteLine("SPAM!"); }
}
0
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
19.09.2011, 13:03  [ТС]
Цитата Сообщение от umnick_kh Посмотреть сообщение
кол-во потоков не зависит от кол-ва ядер
Согласен. Но если создать много потоков на одном ядре это снизит производительность за счет того, что время переключения между потоками будет занимать значительную часть всего времени работы процессора.
И все таки я не понял. Обработчик у меня выполняет получение данных с сервера (три обработчика - три разных сервера) и выглядит так:
C#
1
2
3
4
private void Server_1(System.DateTime datetime, double X)
{
// код использования данных
}
Как лучше с точки зрения быстродействия в этом случае поступить?
0
 Аватар для umnick_kh
311 / 249 / 44
Регистрация: 06.12.2010
Сообщений: 527
19.09.2011, 13:08
Цитата Сообщение от 4dimuser Посмотреть сообщение
Но если создать много потоков на одном ядре это снизит производительность
Ну это само собой.
Цитата Сообщение от 4dimuser Посмотреть сообщение
Как лучше с точки зрения быстродействия в этом случае поступить?
Насколько я понимаю, с точки зрения быстродействия все выше приведенные примеры ничем не отличаются.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.09.2011, 13:09
Операционная система раскидает потоки по процессорам за вас, не волнуйтесь.

C#
1
2
3
4
5
6
7
8
9
private void Server_1(System.DateTime datetime, double X)
{
   new Thread(DoWork).Start();
}
 
private void DoWork()
{
   // код использования данных
}
Метод DoWork будет выполняться в отдельном потоке.
Если надо передать данные в этот поток, то можно сделать так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class StateObject
{
   public DateTime dateTime;
   public double x;
 
   public StateObject(DateTime dt, double num)
   {
      this.dateTime = dt;
      this.x = num;
   }
}
 
private void Server_1(System.DateTime datetime, double X)
{
   new Thread(DoWork).Start(new StateObject(datetime, X));
}
 
private void DoWork(object state)
{
   var param = state as StateObject;
   // код использования данных
}
1
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
19.09.2011, 17:44  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
private void DoWork(object state) { var param = state as StateObject; // код использования данных }
Поясните, пожалуйста, что здесь такое. Не знаком с этой конструкцией.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.09.2011, 17:52
Цитата Сообщение от 4dimuser Посмотреть сообщение
Поясните, пожалуйста, что здесь такое
Если про это:
C#
1
var param = state as StateObject;
то по-другому это можно записать так:
C#
1
StateObject param = (StateObject)state;
Приводим аргумент, полученный из родительского потока к типу StateObject, после чего можем пользоваться данными, хранящимися в нем:
C#
1
2
Console.WriteLine(param.dateTime);
Console.WriteLine(param.x);
Это если надо использовать параметры, полученные в Server_1.
1
Заблокирован
19.09.2011, 17:59
Цитата Сообщение от kolorotur Посмотреть сообщение
Если надо передать данные в этот поток, то можно сделать так
Передать данные в поток, как два пальца об асфальт)))
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System;
 
class Program
{
    static void Main(string[] args)
    {
        new System.Threading.Thread(delegate() { DoWork(2, 2); }).Start();
        Console.ReadKey();
 
    }
    static private void DoWork(int i, int j)
    {
        Console.WriteLine(i * j);
    }
}
1
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
19.09.2011, 18:26  [ТС]
А можно как-то напрямую сделать? Без var param?
Смысл в чем: данные с трех серверов должны обрабатываться одновременно в разных потоках и быть постоянно доступными для основного потока.

Добавлено через 22 минуты
Еще где-то слышал, что нужно использовать буфер для каждого сервера. Что скажете по этому поводу?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.09.2011, 18:26
Помогаю со студенческими работами здесь

Многопоточное программирование по Шилдту: разобрать код
Друзья, у меня вопрос от новичка. Читаю книгу Шилдта и вот дошёл до главы многопоточного программирования. В книге приведён следующий...

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

Многопоточное скачивание
Помогите.Как сделать многопоточное скачивание файлов? using System; using System.Collections.Generic; using System.ComponentModel; ...

многопоточное вычисление
Как организовать многопоточное вычисление функции (x+5)^(2/3) + abs(x+2)^2 - ln(5*tg(x)) - exp(7*sqrt(x))?

Многопоточное приложение
Требуется разработать многопоточное приложение (в качестве средства разработки следует использовать Microsoft Visual Studio). Приложение...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru