2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
1

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

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

Студворк — интернет-сервис помощи студентам
Программа выполняется в одном потоке. Есть три обработчика событий. Как сделать так, чтобы каждый обработчик выполнялся в отдельном потоке параллельно с основным потоком? Процессор четырех ядерный.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.09.2011, 11:46
Ответы с готовыми решениями:

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

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

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

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

12
93 / 93 / 19
Регистрация: 25.12.2010
Сообщений: 316
19.09.2011, 12:18 2
C#
1
Thread th = new Thread();
1
2 / 2 / 0
Регистрация: 04.04.2011
Сообщений: 160
19.09.2011, 12:24  [ТС] 3
Цитата Сообщение от Neser Посмотреть сообщение
Thread th = new Thread();
Куда это записать, прямо в обработчик? Нужно ли как-то закреплять каждый поток за отдельным ядром процессора (4 ядра - 1 основной поток, и 3 обработчика) можете пояснить?
0
Заблокирован
19.09.2011, 12:42 4
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
311 / 249 / 44
Регистрация: 06.12.2010
Сообщений: 527
19.09.2011, 12:44 5
Нет, кол-во потоков не зависит от кол-ва ядер.
Пример:
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
17202 / 12656 / 3321
Регистрация: 17.09.2011
Сообщений: 20,932
19.09.2011, 12:53 6
Оставьте распределение по ядрам процессора на совести операционной системы.

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  [ТС] 7
Цитата Сообщение от umnick_kh Посмотреть сообщение
кол-во потоков не зависит от кол-ва ядер
Согласен. Но если создать много потоков на одном ядре это снизит производительность за счет того, что время переключения между потоками будет занимать значительную часть всего времени работы процессора.
И все таки я не понял. Обработчик у меня выполняет получение данных с сервера (три обработчика - три разных сервера) и выглядит так:
C#
1
2
3
4
private void Server_1(System.DateTime datetime, double X)
{
// код использования данных
}
Как лучше с точки зрения быстродействия в этом случае поступить?
0
311 / 249 / 44
Регистрация: 06.12.2010
Сообщений: 527
19.09.2011, 13:08 8
Цитата Сообщение от 4dimuser Посмотреть сообщение
Но если создать много потоков на одном ядре это снизит производительность
Ну это само собой.
Цитата Сообщение от 4dimuser Посмотреть сообщение
Как лучше с точки зрения быстродействия в этом случае поступить?
Насколько я понимаю, с точки зрения быстродействия все выше приведенные примеры ничем не отличаются.
1
Эксперт .NET
17202 / 12656 / 3321
Регистрация: 17.09.2011
Сообщений: 20,932
19.09.2011, 13:09 9
Операционная система раскидает потоки по процессорам за вас, не волнуйтесь.

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  [ТС] 10
Цитата Сообщение от kolorotur Посмотреть сообщение
private void DoWork(object state) { var param = state as StateObject; // код использования данных }
Поясните, пожалуйста, что здесь такое. Не знаком с этой конструкцией.
0
Эксперт .NET
17202 / 12656 / 3321
Регистрация: 17.09.2011
Сообщений: 20,932
19.09.2011, 17:52 11
Цитата Сообщение от 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 12
Цитата Сообщение от 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  [ТС] 13
А можно как-то напрямую сделать? Без var param?
Смысл в чем: данные с трех серверов должны обрабатываться одновременно в разных потоках и быть постоянно доступными для основного потока.

Добавлено через 22 минуты
Еще где-то слышал, что нужно использовать буфер для каждого сервера. Что скажете по этому поводу?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.09.2011, 18:26
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru