![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Ronin08 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
Доброго времени суток!
я уже поднимал эту тему, но ответа не получил. повторюсь нучжно перемножить матрицу на вектор, но чтобы каждое новое значение в результирующем векторе (для тех кто забыл мат-ку матрица*вектор=вектор) высчитывалось в отдельно потоке. Буду очень благодарен за пример --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Ronin08, вот та самая тема. Скажите, пожалуйста, точно : на какой вопрос Вы не получили ответ? Требуется ли решить вместо Вас поставленную задачу?
Пример Это сообщение отредактировал(а) marcusmae - 28.3.2008, 22:29 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Ronin08 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
ни в коем случае
просто я не могу въехать как передать одной функции другую понимаю что с помощью делегатов но видимо что-то не улавливаю вот как я делаю
Это сообщение отредактировал(а) Ronin08 - 28.3.2008, 22:54 --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
|||
|
||||
| marcusmae |
|
||||||||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Изучите по-подробнее делегаты - будет проще. Дело в том, что там не нужно создавать свой собственный делегат, а нужно лишь указать функцию, подходящую под сигнатуре конкретному делегату - ParameterizedThreadStart (упоминал его в предыдущей теме!)
Функция Potok по аргументам не подходит, поэтому я создаю ещё одну, которая будет служить "подложкой" для вызова :
- просто доверительно преобразуем аргументы из неизвестно чего в пару индексов и тройку матриц. Далее, раз процедура потока у нас имеет аргументы, то при старте потока мы могли бы их инициализировать. Следующий код закомментирован, подставьте в него актуальные параметры :
Наконец, стартуем поток с данными аргументами :
Итого, получается следующая заготовка :
Продолжайте, если будут вопросы - всегда пожалуйста! -------------------- ἀπὸ μηχανῆς θεός |
||||||||||
|
|||||||||||
| Ronin08 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
а как быть в случае, когда мы не знаем при компиляции сколько потоков будет пользователь сам должен вводить я сделал цикл с 4 потоками для примера Это сообщение отредактировал(а) Ronin08 - 28.3.2008, 23:14 --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
||||
|
|||||
| Dennnis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 23.3.2008 Репутация: нет Всего: 4 |
Правильно, там где ты указал есть проблема, но не толко там. Делегат - это указатель на функцию. Это значит что ему необходимо задать функцию, которую он будет вызывать при выполнении. Причем ThreadStart и есть делегат вида delegate void ThreadStart(). Он тебе не подходит, нужен ParameterizedThreadStart.
Вот примерно как надо (сам не проверял
--------------------
Get Rich or Die Tryin' |
|||
|
||||
| marcusmae |
|
||||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Если Вы хотите, чтобы пользователь задавал число потоков - так и сделайте : считайте число в переменную и укажите эту переменную в качестве границы цикла. Лучше не надо так говорить. Если те, кто так говорят не понимают различий, то это ещё не значит, что их нет. Делегат - это делегат. Указатель на функцию - это указатель на функцию.
Если Он - это делегат, то нет, не значит. Функцию будет вызывать поток, а делегат здесь является способом указания метода в качестве аргумента конструктора класса Thread. А в чём моя ошибка и что изменилось?
- так можно Метод Potok c явным указанием типов зря убрали - пусть бы другой, c object, его вызывал, зато аккуратно. Хотя, дело вкуса. А, или эта реплика - не мне? Это сообщение отредактировал(а) marcusmae - 28.3.2008, 23:52 -------------------- ἀπὸ μηχανῆς θεός |
||||||
|
|||||||
| Ronin08 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
Dennnis, в этом случае проблемка с
Ошибка:Unable to cast object of type 'System.Int32' to type 'System.Int32[,]'. у нас ведь двумерный массив Добавлено через 4 минуты marcusmae , в месте
Ошибка: Object reference not set to an instance of an object. --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
||||
|
|||||
| marcusmae |
|
||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Аргументы указали там где было закомментировано? Какие?
Копипаст :
-------------------- ἀπὸ μηχανῆς θεός |
||||
|
|||||
| Ronin08 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
вот такие:
Это сообщение отредактировал(а) Ronin08 - 30.3.2008, 01:17 --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
||||
|
|||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Ronin08, странно это видеть при том, что Вы вроде бы располагаете готовым кодом, понимаете алгоритм и представляете, каким образом его разделять на потоки. В t.Start Вам нужно передать аргументы - те самые аргументы, с которыми будет работать вложенный цикл в процедуре Potok. У Вас они называются Arr1, Arr2, Arr3, i - это индекс строки, j - индекс столбца. Оба индекса Вы фиксируете. Следовательно, цикл, вероятно, должен содержать что-то вроде :
В этом случае потоков будет создано в количестве m * n. Вы, кажется, хотите делать меньше?.. Тогда нужно сделать ещё один цикл внутри функции Potok, который будет перебирать индексы i,j в диапазоне, отведённом каждому потоку (передавать границы диапазонов в качестве параметров). Я понятно излагаю?.. -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Dennnis |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 23.3.2008 Репутация: нет Всего: 4 |
Точно Wikipedia:
Моя ошибка, вобщем вот как надо:
Это сообщение отредактировал(а) Dennnis - 30.3.2008, 11:28 --------------------
Get Rich or Die Tryin' |
||||||
|
|||||||
| Ronin08 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
marcusmae и Dennnis спасибо за ответы,
но вот возникла новая проблема. В нашем коде, потоки запускаются в цикле поочереди, но надо сделать так чтобы они запускались одновременно. Как это можно организовать? --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Модератор: Пожалуйста, один топик - один вопрос.
-------------------- ![]() |
|||
|
||||
| Ronin08 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
так это ведь все одна и та же тема
"Перемножение матриц при вычислениии эллементов матрицы в разных потоках, с одновременным запуском потоков" --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
|||
|
||||
| Dennnis |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 23.3.2008 Репутация: нет Всего: 4 |
Запускаются они по очереди но работают одновременно.
Запуск потока занимает доли % от продолжительности его работы. Запустить несколько потоков одновременно можно только в том случае если они запускаются разными потоками созданными до этого. --------------------
Get Rich or Die Tryin' |
|||
|
||||
| Ronin08 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
Если я не ошибаюсь, то в последнем варианте кода
дело обстоит так: поток1 создался->просчитался эл-т матрици (или эллементы) -> поток1 запустился потом следующий поток2 создался->просчитался эл-т матрици (или эллементы) -> поток2 запустился а надо поток1 создался-> просчитался эл-т матрици (или эллементы) потом следующий поток2 создался->просчитался эл-т матрици (или эллементы) а уже потом поток1 зпустился (Start) поток1 зпустился (Start) т.е. типа "Все потоки, айда запускайтесь" Это сообщение отредактировал(а) Ronin08 - 31.3.2008, 20:44 --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Ronin08, если я правильно понял, то Вы ошибаетесь. Содержимое Potok начинает выполняться в момент вызова метода Start для соответствующего потока. Можете считать, что потоки начинают работать почти одновременно, поскольку никакие два события не могут физически одновременно произойти на последовательной аппаратуре. Разъясню ещё один момент : после вызова Start для одного из потоков, в основном потоке происходит немедленный (асинхронный) возврат. То есть, основной поток не ожидает, пока вспомогательный получит какой-либо результат в методе Potok, а спокойно себе идёт дальше по программе, то есть, последовательно вызывает метод Start для всех потоков. Это сообщение отредактировал(а) marcusmae - 31.3.2008, 21:31 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Ronin08 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
marcusmae, все это понятно, что одновременно не может быть, что все процессы выполняются квазипараллельно и т.д.
Но давайте представим ситуацию, что нам надо перемножить матрицы 500*500 и при этом все вычисления надо разбить на 300 потоков, где гарантия, что все потоки будут задействованы! --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Все ли будут задействованы - зависит от алгоритма. В текущем варианте, на сколько я могу видеть, некратный остаток от деления нагрузки на потоки вообще не учитывается. Кроме того, имеется ошибка, связанная с тем, что в цикле маркеры начала и конца - begin и end - не модифицируются. Рекомендую для начала прогнать многопоточный алгоритм, как он есть, в одном потоке (вместо t.Start вызывать Potok c соотв. аргументами). Ранее чем будут получены правильные результаты, говорить наверно не о чем, да?.. -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Dennnis |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 23.3.2008 Репутация: нет Всего: 4 |
Остаток от деления нагрузки на потоки выполняется последним созданным потоком.
Прогонял - всё сходится (RND заменял на i + j --------------------
Get Rich or Die Tryin' |
||||
|
|||||
| marcusmae |
|
||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
А зачем? Уж не знаю, как проверяли... Вот здесь :
разве правильно, что end меняется единственный раз в таком цикле (не говоря уж о begin)? Или я чего-то недопонимаю? Добавлено через 1 минуту и 53 секунды
Понял, вижу. -------------------- ἀπὸ μηχανῆς θεός |
||||
|
|||||
| Dennnis |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 145 Регистрация: 23.3.2008 Репутация: нет Всего: 4 |
Нет не правильно. Вот как правильно:
Проверил с исправлениями, все нормально. Исходник по которому считал в пр. файле. Присоединённый файл ( Кол-во скачиваний: 5 )
Program.cs 7,28 Kb--------------------
Get Rich or Die Tryin' |
||||
|
|||||
| Ronin08 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
на сколько я знаю в С++ есть такое свойство suspend;
Например, xxx = create Thread(...,suspend); это говорит о том, что после создания потоков, они "подвешиваются" а потом можно просто в цикле запускать star; О такой одновременности я говорил, так как на сомо создание потоков тратится много ресурсов; Это сообщение отредактировал(а) Ronin08 - 1.4.2008, 20:34 --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
C++ - это язык, и у него нет свойств. Вероятно, речь о каком-то пакете, поддерживающем многопоточность? = Например, WINAPI или POSIX pThreads или boost::thread. Во всех трёх возможность Suspend присутствует в том или ином виде. Присутствует и в .NET - Thread.Suspend metod. Следующий тезис неверен : При "создании" потока (new Thread(...)) ничего особенного не происходит, вся вычислительная сложность находится в методе Potok, который запустится только после вызова thread.Start(...). Боюсь, сейчас Вы у себя делаете какие-то неверные выводы. Может, стоит увеличить теоретические познания?.. -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
| Ronin08 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 218 Регистрация: 16.2.2008 Где: г.Москва Репутация: 1 Всего: 1 |
Можно было догадаться, что я описался я имел в виду у метода create Thread() --------------------
Зачем вставать рано или поздно? Надо вставать вовремя |
|||
|
||||
| marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
-------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |