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

Потоки с параметрами

30.05.2013, 22:58. Показов 3192. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Пытаюсь работать с потоками,которые имеют функцию с 5-ю парамерами.
Программу сделал,но при работе она вылетает с ошибкой "Индекс находился вне границ массива".
Но при попытке пошаговой отладки клавишей F11 всё работает.
Но массив в любом случае заполняется не полностью. В чём ошибка,и как исправить? И можно ли вернуть результат функции из какого либо потока?(если функцию изменить)
код:
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
using System;
using System.Threading;
 
namespace ConsoleApplication1
{   
    class Program
    {
        static void Main(string[] args)
        {
            int number = 1;
            Console.WriteLine("Во сколько потоков заполнять?");
            number=Convert.ToInt32(Console.ReadLine());
            int[,] massiv = new int[101, 101];
            int chislo = 100 / number; //определяем диапазон заполнения для одного потока
            int last=0,next=chislo; //переменные для начального индекса и конечного индекса заполнения массива
            Thread[] threads = new Thread[number];
            for (int e = 0; e < threads.Length; e++)
            {
                threads[e] = new Thread(delegate() { vvodmas(last, last, next, next, massiv); }); //нашёл на форумах-передача функции с параметрами в поток
                threads[e].Start(); //запуск потока
                last = next; //началом становится последний индекс массива,который будет обрабатывать предыдущий поток
                next += chislo; //конец-текущий элемент+размерность
            }
            for (int i = 0; i < massiv.GetLength(0);i++ )
            {
                for (int j = 0; j < massiv.GetLength(1);j++ )
                {
                    Console.WriteLine("Элемент {0}", massiv[i, j]); //вывод массива
                }
            }
        }
 
        static void vvodmas(int q, int w, int a, int s, int[,] m)
        {
            Random rnd = new Random();
            for (int i = q; i < a; i++)
            {
                for (int j = w; j < s; j++)
                {
                    m[i, j] = rnd.Next(0, 100); //заполнение диапазона случайными числами
                }
            }
        }
 
    }
}
Тема не сильно важная,но возможно пригодится мне в будущем.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.05.2013, 22:58
Ответы с готовыми решениями:

Подпрограммы с типизированными параметрами -значениями и параметрами-переменными
Помогите пожалуйста). С помощью подпрограммы, определяющей принадлежность символа к заданному множеству, установить количество гласных букв...

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

Подпрограммы с типизированными параметрами -значениями и параметрами-переменными
С помощью подпрограммы подсчитать сумму элементов главной диагонали для матриц 4х4 и 5х5 из вещественных чисел. Добавлено через 1...

23
177 / 94 / 10
Регистрация: 27.05.2013
Сообщений: 290
31.05.2013, 01:03
Конечно массив не заполнится, ты запускаешь кучу независимых потоков и даже не соизволишь дождаться окончания работы по Join()
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
31.05.2013, 04:53
Возвращать результаты работы из функции в другом потоке, конечно, можно. Используйте либо какую-то переменную в их общей области видимости (что выглядит некрасиво и силно вас ограничивает), либо используйте события.Опишите его. Во втором потоке вызывайте, а в первом подпишитесь на него. А результат передается через параметры обработчика событий.
0
2 / 2 / 2
Регистрация: 29.07.2012
Сообщений: 176
31.05.2013, 09:44  [ТС]
Цитата Сообщение от Dexiny Посмотреть сообщение
Конечно массив не заполнится, ты запускаешь кучу независимых потоков и даже не соизволишь дождаться окончания работы по Join()
Так получается мы заполняем массив из одного потока, в то время как другой ждёт его завершения чтобы самому начать заполнять? Или я неправильно понял?
body90, с событиями ещё не работал
0
177 / 94 / 10
Регистрация: 27.05.2013
Сообщений: 290
31.05.2013, 10:30
Как минимум, ты перед выводом массива должен написать такую вещь.
C#
1
2
3
4
for (int e = 0; e < threads.Length; e++)
            {
                threads[e].Join(); //ожидание завершения потока
            }
2
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
31.05.2013, 13:56
Цитата Сообщение от the_maksimka Посмотреть сообщение
body90, с событиями ещё не работал
Как можно полезть в кросспоточность, не зная основ? Как-то Вы не последовательны.

Добавлено через 1 минуту
Без событий (используя общую переменную), вы не будете знать когда функция вернула результат.
0
2 / 2 / 2
Регистрация: 29.07.2012
Сообщений: 176
31.05.2013, 14:02  [ТС]
body90, виноват,но я,как и большинство,видя красивое название темы,открывают сразу её...а остальное потом...
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
31.05.2013, 14:07
Может поможет http://msdn.microsoft.com/ru-r... ys279.aspx
1
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
31.05.2013, 15:02
Цитата Сообщение от body90 Посмотреть сообщение
либо используйте события.Опишите его. Во втором потоке вызывайте, а в первом подпишитесь на него.
И событие вызовется во втором потоке а не в первом.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
31.05.2013, 16:27
Цитата Сообщение от turbanoff Посмотреть сообщение
И событие вызовется во втором потоке а не в первом.
Может быть я сейчас чего-то не понимаю, но у меня всегда обработчик события выполнялся в том потоке, в котором я его подписал на это событие.
0
2 / 2 / 2
Регистрация: 29.07.2012
Сообщений: 176
31.05.2013, 21:46  [ТС]
Эх,всё равно не получается...заполняется несколько элементов,а остальные равны 0...даже после sleep(10000)
Тем более на Join ошибку выдавало-пришлось try влепить...
В общем вот проект...
Вложения
Тип файла: rar ConsoleApplication1.rar (31.7 Кб, 3 просмотров)
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
02.06.2013, 18:00
Цитата Сообщение от body90 Посмотреть сообщение
Может быть я сейчас чего-то не понимаю, но у меня всегда обработчик события выполнялся в том потоке, в котором я его подписал на это событие.
Интересно, можете пример показать? Я могу:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    class Program
    {
        private static event Action someEvenet;
        private static void Main(string[] args)
        {
            Console.Write("Main thread: ");
            PrintCurrentThread();
            someEvenet += () =>
                {
                    Console.Write("Event thread: ");
                    PrintCurrentThread();
                };
            Thread thread = new Thread(() => someEvenet());
            thread.Start();
 
            Thread.Sleep(10000);
        }
 
        private static void PrintCurrentThread()
        {
            Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
        }
    }
Подписка на событие идет в главном потоке, однако событие отрабатывает в другом потоке
0
177 / 94 / 10
Регистрация: 27.05.2013
Сообщений: 290
02.06.2013, 18:30
Цитата Сообщение от turbanoff Посмотреть сообщение
Подписка на событие идет в главном потоке, однако событие отрабатывает в другом потоке
А где регистрация события? ) ты просто по ссылке вызвал функцию someEvenet. Это тоже самое, что называть поле get-set зависимым объектом, ведь мы можешь там вызвать функцию PropertyChanged, но связать 2 таких объекта не сможешь.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
02.06.2013, 19:03
Цитата Сообщение от Dexiny Посмотреть сообщение
А где регистрация события? )
подписка на событие происходит на 8-й строчке.

Добавлено через 1 минуту
Или под регистрацией вы имеете ввиду что-то другое?
0
177 / 94 / 10
Регистрация: 27.05.2013
Сообщений: 290
02.06.2013, 20:43
Конечно, надо регистрировать имя, тип объекта, тип распространения (например пузырьком), делать Raise и вкладывать EventArgs. А то что вы делаете это лишь вызов функции по делегату.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
02.06.2013, 21:00
Цитата Сообщение от Dexiny Посмотреть сообщение
Конечно, надо регистрировать имя, тип объекта, тип распространения (например пузырьком), делать Raise и вкладывать EventArgs.
У нас с вами разное представление о событиях. Можете привести пример?
Цитата Сообщение от Dexiny Посмотреть сообщение
А то что вы делаете это лишь вызов функции по делегату.
1. Там вызывается именно событие.
2. Событие есть ни что иное как поле-делегат и два метода: Add и Remove. (плюс потокобезопасность)
0
177 / 94 / 10
Регистрация: 27.05.2013
Сообщений: 290
02.06.2013, 22:16
Ок если вас забанили на msdn. Спрошу вас, ваше событие какой-то другой объект может поймать? Ну например контейнер, содержащий ваш объект (без явной привязки в коде)? Ведь как-то мышка, хардвеерное устройство, генерирует событие нажатия кнопки, причём не важно в каком потоке работает эта кнопка.

Ещё раз, без метода Raise вы никакие и нигде не вызовете события, а ваше "+=" это лишь приравнивание делегата функции и никаких системных событий не происходит при его разыменовании. То что, тут написано слово event, не делает его таковым с точки зрения механизма событий.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
02.06.2013, 22:30
Цитата Сообщение от Dexiny Посмотреть сообщение
Ок если вас забанили на msdn.
Вот - Raising an Event, там написано в точности как сделал я.
Цитата Сообщение от Dexiny Посмотреть сообщение
Спрошу вас, ваше событие какой-то другой объект может поймать? Ну например контейнер, содержащий ваш объект (без явной привязки в коде)?
Не понял причем здесь это...
Цитата Сообщение от Dexiny Посмотреть сообщение
Ведь как-то мышка, хардвеерное устройство, генерирует событие нажатия кнопки, причём не важно в каком потоке работает эта кнопка.
События мыши ставятся в очередь сообщений Windows и оттуда попадают в главный поток обработки событий формы.
Цитата Сообщение от Dexiny Посмотреть сообщение
То что, тут написано слово event, не делает его таковым с точки зрения механизма событий.
Так я вас и прошу - опишите что вы подразумеваете под словом "событие". Потому что я, и все остальные люди которых я знаю, под событиями понимают именно это.
0
177 / 94 / 10
Регистрация: 27.05.2013
Сообщений: 290
02.06.2013, 22:38
Я про управляемые события, а то что вы используете это лишь привязка делегата функции.
Вот как выглядит например бабл событие.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private static RoutedEvent CloseTabEvent = EventManager.RegisterRoutedEvent("Tab want close", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(Control));
        private void SendWantClose()
        {
            RoutedEventArgs newEventArgs = new RoutedEventArgs(CloseTabEvent);
            RaiseEvent(newEventArgs);
        }
        public event RoutedEventHandler ClickClose
        {
            add { AddHandler(CloseTabEvent, value); }
            remove { RemoveHandler(CloseTabEvent, value); }
        }
        void close_img_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            SendWantClose();
        }
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
02.06.2013, 23:12
Цитата Сообщение от Dexiny Посмотреть сообщение
Я про управляемые события
Аааа, вот оно что.

То есть вы предлагаете в консольном приложении подключать dll-ки от WPF и писать кучу этой требухи только для того чтобы передать значение в другой поток?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2013, 23:12
Помогаю со студенческими работами здесь

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода, потоки вывода..! вот допустим...

Байтовые потоки и потоки символов
Объясните, пожалуйста подробно что имелось ввиду На самом низком уровне все операции ввода/вывода в С# оперируют байтами. Подобный...

Запуск с параметрами
Пишу программу, которая должна уметь запускаться с параметрами. Как это закодить?

Запрос с параметрами
Нужно создать поиск в базе данных с одной таблицей, по нескольким(8) полям. Я так понимаю, запрос с параметрами; параметры, на основе...

процедура с параметрами
Доброе время суток. Пытаюсь сделать свой автоинкримент в IBExpert для fb. Вот код: create or alter procedure AUTO_INCREMENT ( ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru