Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Вложенные циклы

-

Вопросы и ответы, обсуждения

- Ваши вопросы по C# только в данном разделе

Ответ
 
Опции темы
Старый 26.12.2011, 07:22   #1
 Сержант
Аватар для Yukikaze
 
Yukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядом
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
 
По умолчанию Вложенные циклы

Помогите пожалуйста, кто сталкивался с вложенными циклами в нескольких потоках?
У меня есть цикл:
Код:
while (!loginReader.EndOfStream)
            {
                
                
                    username = loginReader.ReadLine();
                
                while (!passwordReader.EndOfStream)
                {
                    lock (locker)
                    {
                        pass = passwordReader.ReadLine();
                    }
                    log.loginer(username, pass);
                    main.linesInFile = main.linesInFile + 1;
                }
            }
который читает строку из первого файла, а потом перебирает все строки во втором. Так вот беда, в один поток это работает на ура, а когда делаю 5-10-15 в общем дофига потоков то цикл накрывается медным тазом, потому что каждый поток пытается взять из первого файла по строке.
Как сделать, что бы из первого файла строка бралась только один раз за цикл, а не умножалась на количество потоков?

ЗЫ Единственное решение которое пришло в голову это добавить ручками N пустых строк в второй фаил и N строк перед каждой строкой в первом О_о
ЗЗЫ И еще один не менее важный вопрос, как выйти из внутреннего цикла если фаил закончился?
Код:
while (!loginReader.EndOfStream)
            {
                
                
                    username = loginReader.ReadLine();
                
                while (!passwordReader.EndOfStream)
                {
                    lock (locker)
                    {
                        pass = passwordReader.ReadLine();
                    }
                    log.loginer(username, pass);
                    main.linesInFile = main.linesInFile + 1;
                    if (passwordReader.EndOfStream)
                    {
                        passwordReader.DiscardBufferedData();
                        break;
                    }
                }
            }
Такой вариант не помогает

Добавлено через 1 час 39 минут
последний вопрос отменяется, какие то в другом месте...найти бы в каком
На счет многопоточности еще в силе

Добавлено через 2 часа 4 минуты
Нашел где косяк, кто объяснит, почему вложенный цикл не запускается повторно?
ЗЫ Я конечно догадываюсь, потому, что он закончился, но тогда как сбросить его на исходную позицию?

Добавлено через 2 часа 46 минут
Последнюю проблему решил иницализировав стримридер повторно
Код:
if (passwordReader.EndOfStream)
                        {
                            passwordReader = new StreamReader(BruteForm.dicBox1);
                            break;
                        }
________________
Talk is cheap. Show me the code
— Linus Torvalds

Последний раз редактировалось Yukikaze; 26.12.2011 в 10:08. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 26.12.2011, 16:04   #2
 Старший сержант
Аватар для Sinyss
 
Sinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака Норриса
Регистрация: 29.07.2011
Сообщений: 197
Популярность: 8989
Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
Отправить сообщение для Sinyss с помощью Skype™
 
По умолчанию Re: Вложенные циклы

Цитата:
Сообщение от YukikazeПосмотреть сообщение
Помогите пожалуйста, кто сталкивался с вложенными циклами в нескольких потоках?

который читает строку из первого файла, а потом перебирает все строки во втором. Так вот беда, в один поток это работает на ура, а когда делаю 5-10-15 в общем дофига потоков то цикл накрывается медным тазом, потому что каждый поток пытается взять из первого файла по строке.
Как сделать, что бы из первого файла строка бралась только один раз за цикл, а не умножалась на количество потоков?

Считать файл в стек и брать данные для потока из него.
Вообще рекомендую наплодить для каждого потока по 1 стеку, в котором сберегается содержание 2го файла, а не считывать его каждый раз. И потоки не будут ждать окончания блокировки от другого потока.
Пускай главный хранит все строки 1го файла, и для каждой строчки создает поток параметром куда идут: ( string <Строка из 1го файла>, Queue <Стек со строками из 2го файла>).
Или сделай еще хитрее:
1й и 2й файл в массивы. дальше работай с ними как для 1го потока в цикле Parallel.For(). // хотя тут не гарантирую, надо проверить, когда писал брутфорсер наткнулся на то что при сравнивании строк оно не всегда выдавало правильный ответ...
  Ответить с цитированием
Пользователь сказал cпасибо:
Yukikaze (27.12.2011)
Старый 27.12.2011, 05:40   #3
 Сержант
Аватар для Yukikaze
 
Yukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядом
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
 
По умолчанию Re: Вложенные циклы

Цитата:
Сообщение от SinyssПосмотреть сообщение
Считать файл в стек и брать данные для потока из него.
Вообще рекомендую наплодить для каждого потока по 1 стеку, в котором сберегается содержание 2го файла, а не считывать его каждый раз. И потоки не будут ждать окончания блокировки от другого потока.
Пускай главный хранит все строки 1го файла, и для каждой строчки создает поток параметром куда идут: ( string <Строка из 1го файла>, Queue <Стек со строками из 2го файла>).
Или сделай еще хитрее:
1й и 2й файл в массивы. дальше работай с ними как для 1го потока в цикле Parallel.For(). // хотя тут не гарантирую, надо проверить, когда писал брутфорсер наткнулся на то что при сравнивании строк оно не всегда выдавало правильный ответ...

Спасибо, покурил мануалы по Parallel.Foreach(), занятная вещица оказалась.

Код:
Parallel.ForEach(Global.globalUser,
                username =>
                {
                    Parallel.ForEach(Global.globalUser,
                    pass =>
                    {
                        log.loginer(username, pass);
                        Global.linesInFile = Global.linesInFile + 1;
                    }
                    );
                }
                );
Такой цикл выдает 70ппс в один поток, правда при запуске в несколько потоков оно просто дублирует результат, но по сути как я понял оно само на потоки делит

Добавлено через 1 час 49 минут
хм...постепенно скорость увеличивается, сначала примерно 10-15 ппс, потом быстро растет до 70 и потихоньку прорывается до рекордных 80. Все это конечно неплохо, если бы не одно "НО", как выйти из внутреннего цикла при определенных условиях?

Добавлено через 3 часа 0 минут
Как выйти из внутреннего цикла я разобрался, просто добавил условие с ParallelLoopState.Break()
И сразу новый вопрос, КАК убить эти 2 цикла? Пытался убить процесс в котором они были запущены, но они все равно продолжают жить своей жизнью, да и loopState как то не помогает.
________________
Talk is cheap. Show me the code
— Linus Torvalds

Последний раз редактировалось Yukikaze; 27.12.2011 в 08:40. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 28.12.2011, 02:21   #4
 Старший сержант
Аватар для Sinyss
 
Sinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака НоррисаSinyss троюродный дядя Чака Норриса
Регистрация: 29.07.2011
Сообщений: 197
Популярность: 8989
Сказал(а) спасибо: 45
Поблагодарили 175 раз(а) в 139 сообщениях
Отправить сообщение для Sinyss с помощью Skype™
 
По умолчанию Re: Вложенные циклы

Вынести в отдельную функцию этот цикл и внутри цикла сделать return ?
  Ответить с цитированием
Старый 28.12.2011, 23:49   #5
 Сержант
Аватар для Yukikaze
 
Yukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядомYukikaze в состоянии испепелить взглядом
Регистрация: 01.10.2011
Сообщений: 128
Популярность: 5723
Сказал(а) спасибо: 25
Поблагодарили 174 раз(а) в 105 сообщениях
 
По умолчанию Re: Вложенные циклы

Цитата:
Сообщение от SinyssПосмотреть сообщение
Вынести в отдельную функцию этот цикл и внутри цикла сделать return ?

В принципе спасибо за совет, но я уже закончил, на моем стареньком Core 2 Duo e8650 при 1мб/с аплод получаю около 80 ппс, у друга на Phenom II x4 идет больше 100.
________________
Talk is cheap. Show me the code
— Linus Torvalds
  Ответить с цитированием
Старый 14.01.2012, 10:46   #6
 Разведчик
Аватар для nicolaiv007
 
nicolaiv007 никому не известный тип
Регистрация: 07.01.2012
Сообщений: 5
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
 
По умолчанию Re: Вложенные циклы

действительно старенький
  Ответить с цитированием
Ответ

Метки
c sharp, многопоточность, thread, циклы


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Помогите!] VB. Циклы! Moisei Вопросы и ответы, обсуждения 1 24.09.2010 23:44

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 17:17.

Пишите нам: forum@zhyk.ru
Copyright © 2025 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net