Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658

Работа с тремя потоками

30.01.2011, 22:40. Показов 2825. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно сварганить 3 потока: первый основной(чтоб форма не залипала, все нужно вынести в следующие два), второй(бесконечный цикл) из которого в третий должны постоянно передаваться 2 массива(
C#
1
            int[,] nnn = new int[30, 30];
и
C#
1
            int[,] mmm = new int[30, 30];
И третий в котором будет осуществляться работа над массивами и вывод результата на форму.
Помогите сообразить плз...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.01.2011, 22:40
Ответы с готовыми решениями:

Написать программу с тремя потоками: чтение из файла, возведение в квадрат, запись в файл
Нужно написать программу с 3-мя потоками: чтение из файла, возведение в квадрат, запись в файл потоки должны работать асинхронно, так же...

Работа с потоками!
Ребята, никогда раньше с потоками не работал... Вот помогите решить проблему Есть метод DrawClicked(bubbleSort, (Button)sender,...

Работа с потоками
Здравствуйте! Такой вопрос. Как на выполнение какой либо операции, например на чтение файла веслом 24 гб, выделить 1,2 или 3 потока, и...

13
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
30.01.2011, 23:37
Собственно, непонятно - нафига тебе тут 2 ( + 1 основной = 3 потока) дополнительных потока? Делай в одном дополнительном потоке обработку массива и выводи на форму. Или сформулируй задание чётче.
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
30.01.2011, 23:47  [ТС]
Цитата Сообщение от SSTREGG Посмотреть сообщение
Собственно, непонятно - нафига тебе тут 2 ( + 1 основной = 3 потока) дополнительных потока? Делай в одном дополнительном потоке обработку массива и выводи на форму. Или сформулируй задание чётче.
Именно 3
Цитата Сообщение от koc94ok Посмотреть сообщение
Нужно сварганить 3 потока: первый основной(чтоб форма не залипала, все нужно вынести в следующие два), второй(бесконечный цикл) из которого в третий должны постоянно передаваться 2 массива(
C#
1
            int[,] nnn = new int[30, 30];
и
C#
1
            int[,] mmm = new int[30, 30];
И третий в котором будет осуществляться работа над массивами и вывод результата на форму.
Помогите сообразить плз...
Во втором постоянно обновляются массивы, они должны передаваться в третий(раз в итерацию к примеру)
А в третьем уже Совершенно другая работа выполняться будет...
Нужно чтобы и то и другое выполнялось одновременно...
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
31.01.2011, 00:27
Вот пример. Только я не создавал такие большие массивы. Скорее всего ты не отделаешься 2 доп. потоками, иначе придется делать синхронизацию => не будет одновременности.

В Label выводится кол-во созданных доп. потоков.

UPD: измени
C#
1
static int threadCount = 0;
на
C#
1
volatile int threadCount;
так будет правильней.
Вложения
Тип файла: rar MultiThreading.rar (40.3 Кб, 54 просмотров)
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
31.01.2011, 01:25  [ТС]
Цитата Сообщение от SSTREGG Посмотреть сообщение
Вот пример. Только я не создавал такие большие массивы. Скорее всего ты не отделаешься 2 доп. потоками, иначе придется делать синхронизацию => не будет одновременности.

В Label выводится кол-во созданных доп. потоков.
Как мне свои два массива грамотно туда чкнуть которые в шапке?
убрать всю ерунду с рандомами, и наконец пример работы с потоками(присваивание 0 элементам в Thread1
C#
1
tp.nnn[i,j] = 0; //так?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
31.01.2011, 01:38
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using System;
using System.Threading;
using System.Windows.Forms;
 
namespace MultiThreading
{
    public partial class Form1 : Form
    {
        bool stopAll;
        volatile int threadCount; // Если не надо - убираешь.
 
        public Form1() {
            InitializeComponent();
        }
 
        struct ThreadParam
        {
            public int[,] nnn;
            public int[,] mmm;
 
            public ThreadParam( int[,] arr0, int[,] arr1 ) {
                if (arr0 == null || arr1 == null)
                    throw new ArgumentNullException("One of args is null.");
                nnn = new int[arr0.GetLength(0), arr0.GetLength(1)];
                mmm = new int[arr1.GetLength(0), arr1.GetLength(1)];
                Array.Copy(arr0, nnn, arr0.Length);
                Array.Copy(arr1, mmm, arr1.Length);
            }
        }
 
        private void button1_Click( object sender, EventArgs e ) {
            stopAll = false;
            new Thread(Thread0).Start();
        }
 
        private void button2_Click( object sender, EventArgs e ) {
            stopAll = true;
        }
 
        void Thread0() {
            ThreadParam tp;
            int[,] arr0 = new int[30, 30], arr1 = new int[30, 30]; // Если они всегда одной длины
            threadCount++;
            while (!stopAll) {
                // инициализируешь массивы
 
                tp = new ThreadParam(arr0, arr1);
                new Thread(Thread1).Start(tp);
                threadCount++;
            }
            threadCount--;
        }
 
        void Thread1( object obj ) {
            if (!(obj is ThreadParam)) {
                threadCount--;
                return;
            }
            ThreadParam tp = (ThreadParam)obj;
 
            // изменяешь массивы
 
            SetTxtText(tp);
            tp.nnn = tp.mmm = null;
            threadCount--;
        }
 
        void SetTxtText( ThreadParam argument ) {
            if (textBox1.InvokeRequired)
                textBox1.Invoke(new Action<ThreadParam>(( arg ) => {
                    // Вывод данных
                }), argument);
            else {
                // Вывод данных
            }
        }
 
        private void timer1_Tick( object sender, EventArgs e ) {
            label1.Text = string.Format("TC: {0}.", threadCount);
        }
    }
}
Цитата Сообщение от koc94ok Посмотреть сообщение
присваивание 0 элементам в Thread1
При создании массива (new int[,]) все элементы будут равны 0.
1
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
31.01.2011, 15:46  [ТС]
что происходит в этой строке?
C#
1
tp.nnn = tp.mmm = null;
удаление массивов?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
31.01.2011, 16:10
koc94ok, можешь её убрать, привычка. А так это удаление ссылки на массив.
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
31.01.2011, 18:05  [ТС]
сунул все свое добро в первый поток, все ок...
интересует вывод:
C#
1
2
3
4
5
6
7
            if (textBox1.InvokeRequired)
                textBox1.Invoke(new Action<ThreadParam>(( arg ) => {
                    // Вывод данных
                }), argument);
            else {
                // Вывод данных
            }
что дает это условие и как вообще чтолибо выводить(примерчик простой)?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
31.01.2011, 18:57
Я же тебе целый проект скинул, там есть вывод. О условии прочитай тут: Control.InvokeRequired - это нужно для вывода данных из другого потока.

Не по теме:

И хорош мне по каждому вопросу в ЛС писать.

0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
31.01.2011, 20:52  [ТС]
Цитата Сообщение от SSTREGG Посмотреть сообщение
Я же тебе целый проект скинул, там есть вывод. О условии прочитай тут: Control.InvokeRequired - это нужно для вывода данных из другого потока.
Вывод подождет... Меня интересует третий поток. Почему действия повторяются в нем?
Хотел вставить некоторые действия с задержкой sleep, думал разово выполнятся, а они бесперебойно...
Может создание потока(3) вынести из бесконечного цикла?(а если не будут передаваться данные?)
помоги плз
А можно ли сделать так чтобы третий поток брал из второго потока элементы массива когда это требуется?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
31.01.2011, 21:34
Обобщенный ответ: как ты поставил вопрос, такой и ответ!

Цитата Сообщение от koc94ok Посмотреть сообщение
Почему действия повторяются в нем?
Где ты
тут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Thread1( object obj ) {
            if (!(obj is ThreadParam)) {
                threadCount--;
                return;
            }
            ThreadParam tp = (ThreadParam)obj;
 
            for (int i = 0; i < tp.Array0.Length; i++)
                tp.Array0[i] ^= 276;
 
            for (int i = 0; i < tp.Array1.Length; i++)
                tp.Array1[i] ^= 875;
 
            SetTxtText(tp);
            tp.Array0 = tp.Array1 = null;
            threadCount--;
        }
повтор видишь!? Это эмуляция, ты сказал
Цитата Сообщение от koc94ok Посмотреть сообщение
И третий в котором будет осуществляться работа над массивами и вывод результата на форму.
прошу результат.
Цитата Сообщение от koc94ok Посмотреть сообщение
Хотел вставить некоторые действия с задержкой sleep, думал разово выполнятся, а они бесперебойно...
см. выше.
Цитата Сообщение от koc94ok Посмотреть сообщение
Может создание потока(3) вынести из бесконечного цикла?
Программа твоя? - твоя. Логика твоя? - твоя. Что ты от меня хочешь? Я тебе привёл полностью рабочий пример, если ты не можешь в нём разобраться, это не ко мне вопросы - значит ты поставил перед собой цель, до которой тебе ещё рано.
Цитата Сообщение от koc94ok Посмотреть сообщение
а если не будут передаваться данные?
...
Цитата Сообщение от koc94ok Посмотреть сообщение
А можно ли сделать так чтобы третий поток брал из второго потока элементы массива когда это требуется?
Тогда нужна синхронизация!!! Если ты будешь из 3 потока брать данные, которые используются во 2ом потоке, то в 90% ты не получишь нормального результата, т.к. данные постоянно будут меняться!

Ты просил одновременное выполнение потоков, я привёл пример - дальше сам пожалуйста.
0
13 / 13 / 2
Регистрация: 22.04.2010
Сообщений: 658
31.01.2011, 21:47  [ТС]

В том то и дело это не то о чем я просил... нету параллельности(одновременности)
Тоже самое получится если содержимое потока 3 чкнуть в цикл второго потока
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
01.02.2011, 23:28
Цитата Сообщение от koc94ok Посмотреть сообщение
Тоже самое получится если содержимое потока 3 чкнуть в цикл второго потока
Нет! В варианте который я тебе привел как раз таки реализована параллельность.

Порядок работы моего кода:
1) Запускается поток Thread0;
2) Выполняются действия над массивами;
3) Запускается Thread1 (новый поток), дальше уже параллельно выполняются 2 фрагмента (I и II):
I) Повтор начиная с 2го пункта; II) Выполнение кода в методе Thread1, Вывод в TextBox. (А в это время уже обрабатываются исходные массивы (п. 2) и достигается п. 3).

Поэтому я и создал счётчик потоков, в котором наглядно показывается, что потоки выполняются одновременно.

Хочешь чтобы было всегда 2 потока, без проблем: (используется синхронизация, и только (!!!) 2 массива, число доп. потоков постоянно, и равно 2)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using System;
using System.Text;
using System.Threading;
using System.Windows.Forms;
 
namespace MultiThreading
{
    public partial class Form1 : Form
    {
        bool stopAll;
        int[] arr0, arr1;
        AutoResetEvent mrEvent0, mrEvent1;
 
        public Form1() {
            InitializeComponent();
            mrEvent0 = new AutoResetEvent(false);
            mrEvent1 = new AutoResetEvent(false);
        }
 
        private void button1_Click( object sender, EventArgs e ) {
            stopAll = false;
            new Thread(Thread0).Start();
            new Thread(Thread1).Start();
            mrEvent0.Set();
        }
 
        private void button2_Click( object sender, EventArgs e ) {
            stopAll = true;
            mrEvent1.Set();
            mrEvent0.Set();
        }
 
        void Thread0() {
            Random rnd;
            while (mrEvent0.WaitOne() && !stopAll) {
                arr0 = arr1 = null;
 
                rnd = new Random(DateTime.Now.Millisecond);
                arr0 = new int[rnd.Next(3, 30)];
 
                rnd = new Random(DateTime.Now.Millisecond);
                arr1 = new int[rnd.Next(3, 30)];
 
                rnd = new Random(DateTime.Now.Millisecond);
                for (int i = 0; i < arr0.Length; i++)
                    arr0[i] = rnd.Next(-100, 100);
 
                rnd = new Random(DateTime.Now.Millisecond);
                for (int i = 0; i < arr1.Length; i++)
                    arr1[i] = rnd.Next(-100, 100);
 
                mrEvent1.Set();
            }
        }
 
        void Thread1() {
            while (mrEvent1.WaitOne() && !stopAll) {
                for (int i = 0; i < arr0.Length; i++)
                    arr0[i] ^= 276;
 
                for (int i = 0; i < arr1.Length; i++)
                    arr1[i] ^= 875;
 
                SetTxtText();
                mrEvent0.Set();
            }
        }
 
        void SetTxtText() {
            if (!textBox1.IsHandleCreated)
                return;
 
            if (textBox1.InvokeRequired)
                textBox1.Invoke(new MethodInvoker( () => {
                    StringBuilder sb = new StringBuilder();
                    sb.Append("Array #0: ");
                    for (int i = 0; i < arr0.Length; i++)
                        sb.Append(arr0[i] + ", ");
                    sb.Append("\r\nArray #1: ");
                    for (int i = 0; i < arr1.Length; i++)
                        sb.Append(arr1[i] + ", ");
 
                    textBox1.Text = sb.ToString();
                }), null);
            else {
                StringBuilder sb = new StringBuilder();
                sb.Append("Array #0: ");
                for (int i = 0; i < arr0.Length; i++)
                    sb.Append(arr0[i] + ", ");
                sb.Append("\r\nArray #1: ");
                for (int i = 0; i < arr1.Length; i++)
                    sb.Append(arr1[i] + ", ");
 
                textBox1.Text = sb.ToString();
            }
        }
    }
}
* AutoResetEvent (дальше можешь не читать, если не понял что такое AutoResetEvent).

Порядок выполнения - последовательный (т.к. используется синхронизация):
1) При создании экземпляра формы, в конструкторе происходит инициализация 2 событий (AutoResetEvent), со сброшенным статусом.
2) Во время клика создаются 2 потока и зависают на моментах (while(mrEventX.WaitOne() && ...) т.к. оба сброшены.
3) После создания потоков первому событию (mrEvent0) присваивается установленный статус, и код в Thread0 после while(mrEvent0.WaitOne() && ...) начинает исполнение, как только он доходит до mrEvent1.Set() начинает исполнение код в методе Thread1 после while(mrEvent1.WaitOne() && ...).
4) Как только исполнение доходит до mrEvent0.Set() начинает выполнятся код в Thread0 после while(mrEvent0.WaitOne() && ...).
5) Шаги с 3 по 5 выполняются до тех пор пока stopAll не станет true.

Надеюсь теперь ты понял разницу между последовательно и параллельно выполняющимися потоками.

+ также прошу заметить то, на сколько % загружает ЦП 1й и 2й варианты (это в доказательство параллельности 1го метода).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.02.2011, 23:28
Помогаю со студенческими работами здесь

Работа с потоками
В общем, сделал рекурсивное удаление файлов и папок в несколько потоков, но вылетают эксепшены что файл уже удален. Можно ли как-то...

Работа с потоками
Добрый день Можно ли из функции (обычное exe приложение) создать вторичный поток, который будет выполняться при завершении работы этой...

Работа с потоками
Всем привет, прошу подсказать есть программка рисующая спираль Архимеда так вот нужно распределить потоки между дугами фигуры (один поток -...

Работа с потоками
Будет ли парсер работать быстрее если изначально был 1 поток по сравнению с 10 потоками ? Ведь все упирается в траффик.Давайте темам...

Работа с потоками
Возникли трудности с потоками. Необходимо, чтобы один поток считывал с консоли, другой выводил эту же информацию на консоль. Поток, который...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru