|
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
|
|
.NET 4.x И снова многопоточность01.06.2014, 02:13. Показов 3001. Ответов 36
Метки нет (Все метки)
Доброй ночи всем!
Я уже понял, что это ооочень заезженная тема "многопоточность") Полностью просмотрел урок (2 часа) http://www.youtube.com/watch?v=strsTAfcAv4 Основы-то понял, но как именно реализовать мою задачу пока не совсем понимаю... А задача в следующем: Имеется какой-то длинный массив строк. Ну и используем к примеру 10 потоков. Должно происходить что-то следующее: 1-й поток берёт себе 1-ю строку массива, 2-й вторую и так далее. НО время выполнения может быть разное, и если первые 9 потоков ещё выполняют задачу, а 10-й поток уже выполнил мвою 10-ю строку, то он должен брать следующую строку массива (11-ю). И так соответственно все остальные. (Не блещу умением объяснять)) Короче: что бы когда поток выполняет какое-то действие с элементом массива, он должен брать следующий первый попавшийся. Сложность с тем, что бы 2 потока не взяли один и тот же элемент... Весь день читаю статьи и не могу точно найти ответ на поставленную задачу. И при помощи чего делать.. Почему-то кажется что подойдёт пул потоков.. Или может через Parallel.For? Скорее всего буду делать WidowsForms, поэтому может быть использовать BackgroundWorker?.. В общем подскажите пожалуйста... Уже очень долго мучаюсь.. P.S. Заранее отвечу на вопрос, программа ProxyChecker.. Просто встала задача под определённый сайт. Саму проверку прокси уже реализовал, вот теперь мучаюсь, что бы ускорить сее творение.
0
|
|
| 01.06.2014, 02:13 | |
|
Ответы с готовыми решениями:
36
И снова про многопоточность Снова многопоточность: совместный доступ к объекту Снова хром, снова сапопроизвольно открывается, снова bkrfdf.xyz и казино |
|
Master of Orion
|
|||||||
| 01.06.2014, 19:43 | |||||||
Сообщение было отмечено awp-sirius как решение
Решение
awp-sirius, Parallel гарантирует именно ту модель поведения, которую вы предлагаете.
Он создает N потоков и дает им первые N элементов на обработку. Если какой-то поток закончил работу, то ему дается следующий по очереди элемент массива. И так до тех пор, пока массив не кончится. Один "быстрый" поток может сделать 3 задачи, в то время как один "медленный" выполнит тем делом только одну. Только вот не принимайте разработчиков за дураков, они не стали бы делать АПИ, которым никто не стал бы пользоваться, а если бы был возможен доступ к одному элементу массива дважды, так оно и было бы.
1
|
|||||||
|
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
|
|||
| 01.06.2014, 21:06 | |||
Создавал уже тему - Потоки не сразу убиваются (или так надо?) , сейчас программы у меня работают через "костыль" - остановка потоков происходит лишь "визуально", и они еще работают некоторое время, если попадется прокси сервер медленный. А как жить то? ![]()
0
|
|||
|
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
|
||||||||||||||||
| 01.06.2014, 21:36 [ТС] | ||||||||||||||||
|
Psilon, Огромное спасибо, выручаете меня уже не первый раз!
Только вот проблема с переменными... Как я понял там, где у вас написано "Console.WriteLine" пишется метод, который выполняется для текущего числа (в вашем примере от 1 до 100). Для меня тоесть это номер сроки массива. Но, когда выполняется вторичный поток он знает только № этой строки, а само значение из массива извлечь не может.. Как мне передать в метод Check сам массив string[] NewProxy = richTextBox1.Lines.ToArray()? Так же проблема наоборот. Если прокси валидный, нужно его записать в richTextBox2, а там ошибка мол richTextBox2 создан в другом потоке. На сколько понимаю это делается как-то при помощи Invoke, но на этом знание заканчивается....
естественно проблема на 29 строке Добавлено через 6 минут с выводом вроде разобрался:
Хотя нет... Не разобрался. Запись-то идёт, но иногда выскакивает ошибка мол обращение из 2-х потоков... lock как-то не помогает почему-то =(
0
|
||||||||||||||||
|
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
|
|
| 01.06.2014, 22:18 | |
|
0
|
|
|
Master of Orion
|
||
| 01.06.2014, 23:32 | ||
|
awp-sirius, используй Parallel.ForEach вместо Parallel.For
А преимущества - то, что слишком много потоков - вся производительность будет убиваться на переключение контекста. В общем почитайте, зачем вообще нужны "пулы" объектов, что потоков, что памяти, что чего-нибудь еще
0
|
||
|
169 / 132 / 29
Регистрация: 16.02.2013
Сообщений: 867
|
|||
| 02.06.2014, 00:20 | |||
Правда мне не жаловались пока на плохую производительность программ . Но если производительность станет лучше - то почему бы и нет?))
0
|
|||
|
Master of Orion
|
|||
| 02.06.2014, 00:53 | |||
|
Winhttp22, просто нет смысла делать хуже, если лучше сделать не сложнее
![]()
![]() http://stackoverflow.com/quest... read-abort Добавлено через 2 минуты советую прочитать все ответы целиком, но краткая выдержка от Эрика:
0
|
|||
|
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
|
||||||
| 02.06.2014, 01:15 [ТС] | ||||||
|
Не могу въехать.....
ForEach<TSource>(IEnumerable<TSource>, Action<TSource, ParallelLoopState>) Что там есть что.. Везде написано мудрёно... Можно хотя бы пример как сделать из
0
|
||||||
|
Master of Orion
|
||||||
| 02.06.2014, 01:30 | ||||||
|
awp-sirius,
awp-sirius, блин, забудьте про текстбоксы и прочее. Вся многопоточность должна работать с внутренними списками и массивами, и не обращаться к элементам формы. В лучшем случае получете ошибку "доступ к компоненту не из потока, в котором он был создан", а в худшем - трудноуловимый баг.
0
|
||||||
|
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
|
||||||
| 02.06.2014, 01:49 [ТС] | ||||||
|
Psilon, Получается список валидных прокси можно будет получить только по окончанию всей проверки...
А как тогда делают подобные программы? Каждый проверенный сразу появляется в текстбоксе.. Может подключить BackgroungWorker? Добавлено через 12 минут Почему вот таким способом не получается сделать?...
0
|
||||||
|
Master of Orion
|
||||||
| 02.06.2014, 01:51 | ||||||
|
awp-sirius, они вызывают событие. А на событие подписывается формочка, и уже сама отображает в своем потоке. Это называется ООП и принцип единой ответственности
![]() Добавлено через 1 минуту хотя бы так:
0
|
||||||
|
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
|
|||||||
| 02.06.2014, 02:46 [ТС] | |||||||
|
или же записать в бокс? Сейчас проверил... Нет.. Видно какие-то потоки зацикливаются.. После выполнения форма неактивна Добавлено через 23 минуты Господи, когда же я уже сделаю это..... Добавлено через 10 секунд ![]() Добавлено через 24 минуты вот так вроде пашет:
0
|
|||||||
|
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
|
||
| 02.06.2014, 07:28 | ||
|
0
|
||
|
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
|
|
| 02.06.2014, 18:50 [ТС] | |
|
Подскажите, как выполнить поставленную задачу правильно?....
Мне кажется нужно всё же использовать backgroundWorker...
0
|
|
|
Master of Orion
|
|
| 02.06.2014, 19:10 | |
|
awp-sirius, я же уже сказал парой постов назад
Всю логику по пингу (или что там у вас) и прочему вообще желательно поместить библиотеку, в которой не должно быть никаких System.Windows.Forms и так далее. Там нужно объявить класс, который будет пинговать и по результатам этих пингов вызывать событие Ping_successed. В это время форма должна подписаться на это событие, ну а в самом событии уже с помощью BeginInvoke отображать результаты на форме.
0
|
|
|
64 / 63 / 43
Регистрация: 01.05.2012
Сообщений: 535
|
||||||
| 02.06.2014, 22:23 [ТС] | ||||||
|
Ладно если откинуть форму вообще. Список прокси из файла записываем в массив.
Просто я не понимаю.... Parallel.ForEach требует статический метод... И как можно из него что-то куда-то записать.............? Добавлено через 12 минут Будет ли такой вариант правильным??
0
|
||||||
|
|
||||
| 02.06.2014, 23:35 | ||||
|
3
|
||||
| 02.06.2014, 23:35 | |
|
Как сделать чтобы таймер дойдя до 0 стартовал снова и снова? HP 625 снова и снова перезагружается в безопасный не заходит Снова поток. Снова синхронизация и снова .htaccess и снова rewriterule
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|