Author Topic: Как сделать такую очередь?  (Read 3889 times)

0 Members and 2 Guests are viewing this topic.

123

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Как сделать такую очередь?
« on: October 05, 2014, 06:45:56 PM »
В игре много аккаунтов-мультов. Скрипт должен по очереди заходить в каждый и запускать процесс, занимающий разное время, указанное при его запуске, и брать на заметку это время. Когда во всех процесс запущен, то заходить в тот, где процесс кончится раньше всех (дождаться этого после входа) или уже кончился, и запустить ещё один процесс, получить его длительность и поместить аккаунт в очередь (шкалу времени), но не именно в её конец, а как получится по его длительности, чтобы он оказался между 2 аккаунтами, где конец процесса наступит чуть раньше, чем у него, и чуть позже, чем у него. А если найдётся с равным, чтобы, без паники, ставил сразу за ним.
Кроме того, иногда может понадобиться поковыряться в 1 из аккаунтов вручную и чтобы скрипт его в это время не трогал, желательно, без своей остановки. Для этого можно и совсем убирать аккаунт из очереди и "поля зрения" скрипта, а потом возвращать. Ещё должна быть возможность добавлять новый аккаунт на этот конвейер, желательно, без его остановки.
« Last Edit: October 05, 2014, 06:47:43 PM by 123 »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Как сделать такую очередь?
« Reply #1 on: October 05, 2014, 07:16:56 PM »
В каком виде и каком формате указано время окончания процесса (или длительность). Как мы его получаем?
Очередь не нужна. Как минимум время окончания всех загонять в массив (двухмерный, примерно время:аккаунт). Массив во время ожидания перебираем на поиск вышедшего времени.
Запускаем. Новое время в массиве обновляем. Может понадобиться его временно обнулить или удалить из массива если процесс запуска длительный.
« Last Edit: October 05, 2014, 07:22:37 PM by Vint »


123

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Как сделать такую очередь?
« Reply #2 on: October 05, 2014, 07:44:03 PM »
Указана длительность пути в 1 сторону в формате минуты:секунды, которую надо умножить на 2 и вычесть, например, 10 секунд (возня со входом, ожидание загрузки).
Массив это чисто в памяти, как можно будет в процессе работы "забрать" у скрипта 1 из аккаунтов или добавить без плохих последствий? С помощью записей в файл такое может получиться?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Как сделать такую очередь?
« Reply #3 on: October 06, 2014, 08:19:48 AM »
Как угодно. Как придумаешь способ удобного управления для тебя так и можно сделать.
Файл не очень хорошая идея. Когда файл открыт может выйти время и скрипту понадобится изменить файл. Даже если не возникнет блокировка ты перезапишешь старым неправильным вариантом и даже не заметишь.
Можно выводить в окно лога номер: оставшееся время
и отлавливать управление клавиатурой.
Нужно пробовать и выбирать удобный вариант.
Указана длительность пути в 1 сторону в формате минуты:секунды...?
В каком виде, картинка? Значит ещё нужно распознавание этого времени.


123

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Как сделать такую очередь?
« Reply #4 on: October 06, 2014, 04:23:26 PM »
Время в одном и том же месте на экране флэш игры. Должно получиться сохранением отдельно каждой цифры 0-9, поиска их по очереди и составление числа времени из того, что найдено.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Как сделать такую очередь?
« Reply #5 on: October 06, 2014, 05:00:20 PM »
Для времени использовать типа этого http://crapware.aidf.org/forum/index.php?topic=88.msg1571#msg1571
В принципе всё можно уже делать. Делай или выкладывай данные для скрипта (скрины, области...)


123

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Как сделать такую очередь?
« Reply #6 on: October 09, 2014, 05:51:35 PM »
Почитал про массивы тут и ужаснулся. Думаю, из-за работы по принципу стека и скудности команд - всего 3, не считая картиночных (или я что-то не нашёл), их использование для этой задачи больше усложнит алгоритм, чем упростит. При старте всей очереди ещё ладно - идёт повторение одних и тех же действий для нескольких аккаунтов в любом порядке, в котором они окажутся в массиве. Но когда значения по одному придётся выковыривать с самого или почти с самого "дна" "мешка", при этом сохраняя остальные, это будет что-то уЖяСтНоЭ. Может, проще наделать не связанных между собой переменных с порядковыми номерами, входящими в их названия? И поиск минимального значения в любом случае не делается одним лёгким движением, а придётся сравнивать их все со всеми?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Как сделать такую очередь?
« Reply #7 on: October 09, 2014, 06:33:32 PM »
нагнал ужасу. Всё просто. Есть же обращение по индексу.
Берешь нужное и за 1 цикл сдвигаешь начиная с n+1 на n до конца массива. Последний выбрасываешь.
Сравнение тоже за 1 цикл. Первый назначаем меньшим, сравниваем меньшее с каждым следующим. Берем меньшее.
количество сравнений равно всего количеству элементов.