Как запускать потоки поочереди? а не все сразу



  • Например если выбрали 30 потоков, можно как то сделать что бы все они запускались с задержкой в 20 секунд например, стартовал первый, ждем 20 секунд потом второй поток и т.п.
    Подскажет кто как реализовать?



  • устанавливаешь в onApplicatonStart глобальную переменную в ноль. Далее каждый поток берет, и увеличивает ее на 20. После этого через действие Sleep устанавливаешь время равное глобальной переменной.



  • @lev said in Как запускать потоки поочереди? а не все сразу:

    onApplicatonStart

    Можно подробнее пожалуйста? как сделать что бы каждый поток увеличивал глобальную переменную на 20 секунд?



  • @35xakers Я думаю можно номер потока взять http://community.bablosoft.com/topic/197/вывести-в-переменную-номер-текущего-потока и потом допустим умножать номер потока на количество секунд, например 1 поток= 20на1, 2 поток=20на2 и т.д. и результат в ожидание кидать. Или можно например цикл сделать, ждать 20 секунд один раз если 1 поток, 2 раза если второй...



  • @35xakers Вот проект по мотивам ответа @Canine
    0_1475668183691_startsequentially.xml



  • @support said in Как запускать потоки поочереди? а не все сразу:

    @35xakers Вот проект по мотивам ответа @Canine
    0_1475668183691_startsequentially.xml

    уважаемый @support - может возможно все таки сделать такую настроку для многопотока - то есть добавить опцию - интервал между запусками потоков указать - и по умолчанию их сделать чтобы они с какой то задержкой запускались друг от друга, чтобы не жрали одинаковые ресурсы?



  • @Turutur Опишите пожалуйста точно как вы хотите, чтобы работало, желательно с примером. Возможно сделаю.
    Да, и в новой версии есть ручное управление браузером, так что его можно создавать по желанию в определенное время в том числе и после задержки.



  • @support said in Как запускать потоки поочереди? а не все сразу:

    Опишите пожалуйста точно как вы хотите, чтобы работало, желательно с примером.

    Да тут в принципе и описывать нечего - просто по умолчанию сделайте паузу в запуске между потоками - минимально необходимую, чтобы BAS не использовал одни и те же данные - и возможно добавить настройку - поле ввода для это паузы
    0_1477351420571_2016-10-25_091426.jpg

    если без настройки - тогда какой то промежуток по умолчанию, чтобы не брались одни и те же строки из файла



  • @Turutur Я совсем запутался. БАС не использует одни и те же данные после перезапуска потока.

    Я думал, что вам нужны паузы между в начале работы приложения. Если вы хотите чтобы делало паузы между запусками потока, то этого легко добиться поставив Спать последним действием.



  • @support said in Как запускать потоки поочереди? а не все сразу:

    БАС не использует одни и те же данные после перезапуска потока

    я не знаю по поводу перезапуска - но была ситуация, когда выставив 3 потока, где из списка брался первый элемент с удалением - все три потока использовали один и тот же элемент - затем он удалялся и все три потока использовали второй первый элемент...

    @support said in Как запускать потоки поочереди? а не все сразу:

    Если вы хотите чтобы делало паузы между запусками потока, то этого легко добиться поставив Спать последним действием.

    Что то сдесь логика не прослеживается - спасть последним действием - это действие которое выполняется в конце потока - а при многопотоке потки идут паралельно?! - или нет? Если параллельно - то речь о том. чтобы сделать настройку для ступенчатого их запуска! друг за другом в заданном интервале



  • @Turutur Я сделал так.
    В начале сделал сон от 1 минуты до 3 минут, в принципе все устраивает и получаются необходимые задержки)



  • @Turutur

    я не знаю по поводу перезапуска - но была ситуация, когда выставив 3 потока, где из списка брался первый элемент с удалением - все три потока использовали один и тот же элемент - затем он удалялся и все три потока использовали второй первый элемент...

    Да так и происходит. Когда вы загружаете ресурс в список то происходит копирование данных, и удаление данных из списка не влияет на ресурс. Это решается использованием ресурса {{res}}, а не таймаутами.

    Что то сдесь логика не прослеживается - спасть последним действием - это действие которое выполняется в конце потока - а при многопотоке потки идут паралельно?! - или нет? Если параллельно - то речь о том. чтобы сделать настройку для ступенчатого их запуска! друг за другом в заданном интервале

    Тогда предложенный вами вариант интерфейса будет смущать пользователей



  • @support said in Как запускать потоки поочереди? а не все сразу:

    Это решается использованием ресурса {{res}}, а не таймаутами.

    Что есть {{res}}? - я же не матерюсь - а Вы начинаете - я же помощи прошу - как мне при многопотоке брать первый элемент с удалением так, чтобы он был разный для всех потоков? Я так понимаю, что вариант предложенный @35xakers - то же не решит вопрос?

    @support said in Как запускать потоки поочереди? а не все сразу:

    Да так и происходит. Когда вы загружаете ресурс в список то происходит копирование данных, и удаление данных из списка не влияет на ресурс. Это решается использованием ресурса {{res}}, а не таймаутами.

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



  • @support said in Как запускать потоки поочереди? а не все сразу:

    Когда вы загружаете ресурс в список то происходит копирование данных, и удаление данных из списка не влияет на ресурс.

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

    Скорее всего Вам это покажется бредом - я не настаиваю на правильности того что изложил - я просто показываю как это видел я, до того как Вы скинули пример - и если так думал я, человек без навыков кодирования - то так могут думать и другие простые пользователи. И мне до сих пор непонятно - почему не удалось сделать как делал я?

    В онапликатионстарт делаем ресурс в список - присваиваем список в глобальную переменную и используем ее в основном проекте для всех потоков - то есть используем виртуальный список - берем с него первый элемент с удалением - (там даже галочка такая есть).... - - - Это я все веду к тому, что Вы ООООЧЕНЬ СЛОЖНО реализуете программу - каждый раз что-то пытаясь сделать - я начинаю чувствовать себя обезьяной с гранатой или дауном - хотя судя по тому, что я администрирую сайты и вношу изменения в штмл и цсс, причем удачно - таким не являюсь, хотя кто знает))).

    Вот простой пример - использования авторизации по печенькам - да у меня чуть материнка в голове не пригорела - я как простой пользователь это вижу так:
    загрузил сайт - ввел логин и пароль - авторизовался - записал кукисы в файл - это все понятно - далее авторизация по кукисам - 1е действие - загрузил кукисы - 2ое действие загрузил сайт - ВСЕ!!! - Кукисы уже были загружены в браузер - авторизация прошла успешно - Можно ли так сделать? - Это просто и логично в моем понимании) ВЕДЬ ИСПОЛЬЗОВАНИЕ ПРОКСИ РЕАЛИЗОВАНО ИМЕННО ТАК!!! СДЕЛАЙТЕ ТАК ЖЕ С КУКИСАМИ!!!!



  • @Turutur

    Что есть {{res}}? - я же не матерюсь - а Вы начинаете - я же помощи прошу - как мне при многопотоке брать первый элемент с удалением так, чтобы он был разный для всех потоков? Я так понимаю, что вариант предложенный @35xakers - то же не решит вопрос?

    Это элементарная задача - решается с помощью использования ресурсов. Когда используете ресурс, то БАС сам следит за тем чтобы он был разным для всех потоков. Что может быть проще?

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

    Зачем пытаться сделать сложно, там где можно сделать легко?

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

    Какую цель вы ставите перед собой делая эти действия?

    Скорее всего Вам это покажется бредом - я не настаиваю на правильности того что изложил - я просто показываю как это видел я, до того как Вы скинули пример - и если так думал я, человек без навыков кодирования - то так могут думать и другие простые пользователи. И мне до сих пор непонятно - почему не удалось сделать как делал я?

    Потому что когда вы загружаете список в ресурс, то это просто копия ресурса и там могут быть ресурсы, которые другой поток использует сейчас.

    В онапликатионстарт делаем ресурс в список - присваиваем список в глобальную переменную и используем ее в основном проекте для всех потоков - то есть используем виртуальный список - берем с него первый элемент с удалением - (там даже галочка такая есть).... - - - Это я все веду к тому, что Вы ООООЧЕНЬ СЛОЖНО реализуете программу - каждый раз что-то пытаясь сделать - я начинаю чувствовать себя обезьяной с гранатой или дауном - хотя судя по тому, что я администрирую сайты и вношу изменения в штмл и цсс, причем удачно - таким не являюсь, хотя кто знает))).

    Это сделано для того, чтобы удалять дубликаты. Можно сделать проще - дописывать данные в файл сразу. Небольшой костыль пока не OnApplicationEnd

    Вот простой пример - использования авторизации по печенькам - да у меня чуть материнка в голове не пригорела - я как простой пользователь это вижу так:
    загрузил сайт - ввел логин и пароль - авторизовался - записал кукисы в файл - это все понятно - далее авторизация по кукисам - 1е действие - загрузил кукисы - 2ое действие загрузил сайт - ВСЕ!!! - Кукисы уже были загружены в браузер - авторизация прошла успешно - Можно ли так сделать? - Это просто и логично в моем понимании) ВЕДЬ ИСПОЛЬЗОВАНИЕ ПРОКСИ РЕАЛИЗОВАНО ИМЕННО ТАК!!! СДЕЛАЙТЕ ТАК ЖЕ С КУКИСАМИ!!!!

    Так и есть, но в том примере, что я сбрасывал поверх этого сделано несколько улучшений.
    1). Проверка того, существует ли файл с куками.
    2). Разные файлы для разных пользователей.
    3). Проверка того, был ли выполнен вход.
    4). Если сессия устарели вход все равно может быть выполнен с помощью логина и пароля.
    5). Поддержка логинов, которые могут содержать символы запрещенные

    Если начнете с тех 2 действий, которые описали, а потом будете добавлять фичи по одной, получится такая функция, как в примере.



  • @support Огромное человеческое спасибо! Это великий труд с Вашей стороны!
    Неправильный ход моей мысли при использовании BAS - это моя проблема - просто реально прилагая усилия - хочется научиться понимать алгоритмы использования действий - примеров маловато(. Спасибо еще раз...



  • Подскажите как модифицировать предложенное решение, чтобы потоки не по 1-му стартовали по очереди, а партиями например по 20 штук(для примера число ядер процессора). Т.е. стартовали 20 потом через 30 секунд еще 20(к этому моменту 40 работают), потом еще через 30 секунд еще 20.



  • @Basak298 Самое простое, это в начале скрипта определять номер потока, а затем

    if
       [[THREAD_INDEX]] > 20 && [[THREAD_INDEX]] < 40
          sleep 30000
    if
       [[THREAD_INDEX]] > 40 && [[THREAD_INDEX]] < 60
          sleep 60000
    if
       [[THREAD_INDEX]] > 60 && [[THREAD_INDEX]] < 80
          sleep 90000
    if
       [[THREAD_INDEX]] > 80 && [[THREAD_INDEX]] < 100
          sleep 120000
    


  • @Fox определил номер потока и вставил Ваш код вначале(еще поправив синтаксис). Сейчас BAS тупо виснет при старте. Не пойму в чем причина. Если не сложно можете кусок простого проекта с такой реализацией скинуть?



  • Может кто-то привести пример с куском кода по моему вопросу? У меня BAS виснет и приложение BAS завершает работу.


Log in to reply
 

  • 6
  • 3
  • 2
  • 4
  • 11
  • 54
  • 12
  • 4