Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/22: Рейтинг темы: голосов - 22, средняя оценка - 4.50
 Аватар для Hermein
99 / 43 / 16
Регистрация: 25.10.2011
Сообщений: 246
.NET 2.x

Многопоточность

19.11.2011, 12:12. Показов 5060. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, встала резко задача использования многопоточности без повторения переменных массива
Итак имеется массив mas состоящий из 100 элементов от 0 до 99, мне необходимо вывести все эти элементы в 1-10 потоков.

Как это сделать вообще не понимаю.
C#
1
2
3
4
5
6
7
            Thread[] thread = new Thread[10];            
            for (int i = 0; i < 10; i++)
            {
                thread[i]= new Thread(new ThreadStart(potok));
                thread[i].IsBackground = true;
                thread[i].Start();
            }
Запускаем 10 потоков, а дальше что?
ps: вариант с lock отпадает сразу, я с ним могу сделать, но он блокирует другие потоки и получается процесс выполняться будет в 1 поток
т.е
C#
1
2
3
4
5
6
7
8
void potok()
{
lock(this)
{
//здесь исполняемы код
}
 
}
Не подходит вариант!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.11.2011, 12:12
Ответы с готовыми решениями:

Многопоточность
Доброго времени суток! Пишу довольно редко, самостоятельно не получилось разобраться:( Сразу перейду к задаче. Допустим есть цикл: ...

Многопоточность
Имеется класс class MainMeneger: Form, в нем объявляются интерфейсы public IMainForm view; public IMessegeService messege; public...

Многопоточность
Доброго времени суток. Делаю задачу на запуск самолетов. Самолет - объект класса, который обладает параметрами: скорость, направление,...

26
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
20.11.2011, 13:43
Студворк — интернет-сервис помощи студентам
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
        private void button1_Click(object sender, EventArgs e)
        {
            List<int> list = new List<int>();
 
            for (int i = 0; i < 1000; i++)
                list.Add(i);
 
            for (int i = 0; i < 10; i++)
            {
                int offset = i;
                new Thread(delegate(object o)
                {
                    Print(list.ToArray(), offset * 100, 100);
                }).Start();
            }
        }
 
        string lol = "";
        object lockerVariable = new object();
 
        void Print(int[] arr, int offset, int count)
        {
            lock (lockerVariable)
            {
                for (int i = offset; i < offset + count; i++)
                    lol += arr[i] + "\r\n";
                lol += "\r\n";
            }
 
            
            richTextBox1.Invoke(new EventHandler(delegate
            {
                if (richTextBox1.Text.Length <= 1)
                {
                     richTextBox1.AppendText(lol);
                     lol = string.Empty;
                }
            }));
        }
Добавлено через 9 минут
Всё поправил, что сначала было, то было немного не правильно.
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
20.11.2011, 13:52
Цитата Сообщение от Hermein Посмотреть сообщение
Его лочить надо, если мы постоянно в него добавляем, а так все добавляется в переменную, которая потом разово записывается в рич.
Неправда ваша. Каждый поток пытается запихнуть свой результат в ричбокс, не считаясь с другими потоками.

Цитата Сообщение от Casper-SC Посмотреть сообщение
C#
1
2
3
4
5
6
lock (lockerVariable)
 {
 for (int i = offset; i < offset + count; i++)
 lol += arr[i] + "\r\n";
 lol += "\r\n";
 }
Так теряется весь смысл создания потоков, т.к. каждому потоку придется ждать завершения цикла другого потока.

Я бы вообще сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        void Print(int[] arr, int offset, int count)
        {
            StringBuilder sb = new StringBuilder();
 
            for (int i = offset; i < offset + count; i++)
               sb.AppendLine(arr[i]);
            sb.AppendLine();
            
            richTextBox1.Invoke(delegate
            {
                lock (locker)
                {
                   if (richTextBox1.Text.Length <= 1)
                   {
                        richTextBox1.AppendText(sb.ToString());
                   }
                }
            }));
        }
Глобальная строка тут не нужна, а залочить можно один раз после обработки.
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
20.11.2011, 14:13
Цитата Сообщение от kolorotur Посмотреть сообщение
Так теряется весь смысл создания потоков, т.к. каждому потоку придется ждать завершения цикла другого потока.
Я бы тоже сделал по другому. Как минимум небыло бы глобальной переменной, и тоже бы использовал StringBuilder (я в курсе, что каждый раз создаётся новая строка), только мне было интересно разобраться в его проблеме вот и всё, то есть как можно решить проблему максимально сохраняя его код. А писать что-то своё тоже как-то не хотелось... Да и далеко не всегда StringBuilder работает быстрее, хотя всё-таки тут и в правду ему самое место. Я вообще сделал разделение на части (ну я выкладывал код в начале темы), потому-что прочитал ваш совет
Цитата Сообщение от kolorotur Посмотреть сообщение
то вручную разбивайте список на сегменты и давайте каждому потоку на обработку отдельный сегмент.
но видимо я его не так понял, а про другие варианты и не думал даже, сразу почему-то пришло в голову делить на части .
0
 Аватар для Hermein
99 / 43 / 16
Регистрация: 25.10.2011
Сообщений: 246
20.11.2011, 17:18  [ТС]
В общем все-равно ничего не работает как надо
C#
1
2
3
4
5
6
7
8
9
10
 richTextBox1.Invoke(delegate
            {
                lock (locker)
                {
                   if (richTextBox1.Text.Length <= 1)
                   {
                        richTextBox1.AppendText(sb.ToString());
                   }
                }
            }));
С этой конструкцией шарп послал далеко и надолго
StringBuilder sb = new StringBuilder();
Создается каждым потоком в итоге на вывод только 1/10 часть! при 10 потоках

В общем разобрался в чем проблема:
Надо отслеживать работу потоков и когда все завершатся, тогда только вывести текст, я не знаю как их отслеживать поэтому сделал так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Print(int[] arr, int offset, int count)
        {
            for (int i = offset; i < offset + count; i++)
                {
                    test.Add(i);
                }            
            this.vyvod();
           
        }
    private void vyvod()
        {
            Thread.Sleep(2000);
            
                richTextBox1.Invoke(new EventHandler(delegate
                {
                    richTextBox1.Clear();
                    richTextBox1.AppendText(test.Count.ToString());                 
                    test.Clear();
                }));               
           
        }
List<int> test = new List<int>(); - глобальная
Вот так все очень хорошо пашет, но хотелось бы не через опу, а нормально отслеживать состояние потоков.
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
20.11.2011, 17:21
Дело в:
C#
1
2
3
4
                   if (richTextBox1.Text.Length <= 1)
                   {
                        //...
                   }
Цитата Сообщение от Hermein Посмотреть сообщение
Создается каждым потоком в итоге на вывод только 1/10 часть! при 10 потоках
Причина всё та же.

Вообще в курсе про отладку? Ну когда код исполняешь пошагово?
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
        private void button1_Click(object sender, EventArgs e)
        {
            List<int> list = new List<int>();
 
            for (int i = 0; i < 1000; i++)
                list.Add(i);
 
            for (int i = 0; i < 10; i++)
            {
                int offset = i;
                new Thread(delegate(object o)
                {
                    Print(list.ToArray(), offset * 100, 100);
                }).Start();
            }
        }
 
        string lol = "";
        object locker = new object();
 
        void Print(int[] arr, int offset, int count)
        {
            StringBuilder sb = new StringBuilder();
 
            for (int i = offset; i < offset + count; i++)
                sb.AppendLine(arr[i].ToString());
            sb.AppendLine();
 
            richTextBox1.Invoke(new EventHandler(delegate
            {
                lock (locker)
                    richTextBox1.AppendText(sb.ToString());
            }));
        }
1
 Аватар для Hermein
99 / 43 / 16
Регистрация: 25.10.2011
Сообщений: 246
20.11.2011, 17:47  [ТС]
Спасибо всем огромное за помощь!
Полностью рабочий вариант:

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
int counthread = 0;
List<int> test = new List<int>();
private void button1_Click(object sender, EventArgs e)
        {
             List<int> list = new List<int>();
             for (int i = 0; i < 100; i++)
            {
                list.Add(i);
            }
            for (int i = 0; i < 10; i++)
            {
                int offset = i;
                new Thread(delegate(object o)
                {
                    Print(list.ToArray(), offset * 10, 10);
                }).Start();
            }
        }
 void Print(int[] arr, int offset, int count)
        {
            for (int i = offset; i < offset + count; i++)
                {
                    test.Add(i);
                }
            lock (this) 
            { this.counthread += 1; }
            if (this.counthread == 10)
            {
                this.counthread = 0;
                richTextBox1.Invoke(new EventHandler(delegate
                {
                    richTextBox1.Clear();
                    foreach (int i in test)
                    {
                        richTextBox1.AppendText(i + "\r\n");
                    }
 
                }));
                test.Clear();
            }           
        }
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
20.11.2011, 19:17
Кстати, вот как вариант и тоже рабочий и без ключевого слова delegate:
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
        private void button1_Click(object sender, EventArgs e)
        {
            List<int> list = new List<int>();
 
            for (int i = 0; i < 1000; i++)
                list.Add(i);
 
            for (int i = 0; i < 10; i++)
            {
                int offset = i;
                new Thread(new ParameterizedThreadStart(DoWork))
                    .Start(new ArraySegment<int>(list.ToArray(), offset * 100, 100));
            }
        }
 
        object locker = new object();
 
        private void DoWork(object data)
        {
            ArraySegment<int> segment = (ArraySegment<int>)data;
            StringBuilder sb = new StringBuilder();
 
            for (int i = segment.Offset; i < segment.Offset + segment.Count; i++)
                sb.AppendLine(segment.Array[i].ToString());
            sb.AppendLine();
 
            richTextBox1.Invoke(new Action(delegate
            {
                lock (locker)
                    richTextBox1.AppendText(sb.ToString());
            }));
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.11.2011, 19:17

Многопоточность
вообщем вот что имею public int index = -1; public int count = 10; private static readonly object SyncIndex = new...

Многопоточность
Здравствуйте. Столкнулся с проблемой, при работе с многопоточностью. Потоки создал так: private void...

Многопоточность
Всем привет. Как реализовать многопоточность с выбором количества потоков? Буду очень благодарен.

Многопоточность
Доброго времени суток всем. Народ задача стоит многопоточное умножение матриц. Ну если я правильно всё догнал, то получается примерно...

Многопоточность в C#
Уважаемые, программисты! Помогите, пожалуйста, реализовать пример с потоками. Мне нужно для примера, чтобы в первом потоке на форме...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru