Author Topic: Перезапуск итерации цикла с помощью доп.потока  (Read 1529 times)

0 Members and 1 Guest are viewing this topic.

Riversong

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Здравствуйте. Я пишу код для кликера, который обходит n-ное количество аккаунтов одной онлайн игры. Зайдя на аккаунт кликер делает определенные операции, после чего выходит убив процессы игры, меняет номер аккаунта (+1) в цикле и приступает ко входу на другой аккаунт. И так до тех пор, пока не пройдется по всем аккаунтам. Однако в игре может произойти вылет. В случае вылета игра выдаёт табличку. Для отлова вылета я написал поток, в котором происходит поиск этой таблички по цвету. В случае нахождения - поток выключает игру и должен зайти заново на тот же аккаунт, на котором произошел вылет. Я смог написать в потоке код, который отлавливает табличку и убивает процесс, но не смог написать код чтобы кликер запускал аккаунт повторно на котором произошел вылет. Подскажите пожалуйста как написать код?

Code: [Select]
$S_CORR = 0
THREAD(proverka,1)//поток который отлавливает табличку гласящую об вылете
$find=0
   WHILE($find = 0)
      GETSCREEN
        IF_PIXEL_IN(635,400, 730,425,2049638)
          print("Вылет")//677 416
           EXECUTE("TASKKILL","/F /IM процессИгры.exe")
           WAIT(2)       
        ELSE
          WAIT(2)
        END_IF
   END_CYC 
END_THREAD

$numAkk = 1  //номер аккаунта с которого начинаем обход
WHILE($numAkk <= 10)  //всего к примеру 10 аккаунтов
     //основной блок кода, который обеспечивает действия по входу в определенный аккаунт
     $numPers = $numPers +1 //пройдя по аккаунту и совершив в нём все необходимые действия прибавляем +1 к номеру аккаунта, убиваю процесс игры и цикл обеспечивает заход на след.аккаунт.
END_CYC 
HALT

Например произошел вылет на аккаунте номер 5. Необходимо, чтобы отлавливающий ошибку поток перезапустил цикл с аккаунтами именно с аккаунта 5 (на котором был вылет).

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Если тебе нужен доп. поток, то разумнее всего будет поместить в него код, который обходит аккаунты

Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN(635,400, 730,425,2049638)
   print("Вылет") // 677 416
   SETTHREAD(TH_PROFILES_VISIT, 2) // Поток ставится на паузу, при этом при дальнейшем снятии с паузы он начинает выполняться с начала
   EXECUTE("TASKKILL","/F /IM процессИгры.exe")
ELSE
   SETTHREAD(TH_PROFILES_VISIT, 1) // Снятие с паузы
   WAITMS(250)
END_IF

THREAD(TH_PROFILES_VISIT, 0)
// Тут обходишь аккаунты
END_THREAD
« Last Edit: August 03, 2019, 07:35:02 PM by Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Riversong

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Я обернул основной код в поток и в случае вылета кликер перезапускает игру, но заходит на тот аккаунт с которого начинал. Например если в переменной номера аккаунта указанно $numAkk = 1, то получив вылет на аккаунте 5 кликер перезапустит игру, но не с 5 аккаунта, а с 1го не смотря на то, что переменная $numAkk должна была равняться 5 (др. словами на момент вылета она равна 5, но при перезапуске потока возвращается к исходному значению). Как перезапустить поток сначала, но при этом сохранив в переменной $numAkk номер именно того аккаунта, на котором произошел вылет?

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Можно использовать однократное (объявление) инициализацию
Code: (clickermann) [Select]
DEFINE($numAkk, 1)

или сделать что то вроде такого
Code: (clickermann) [Select]
IF($i > 9)
   HALT
END_IF
FOR($i = $i - 10*($i > 9), $i < 11)
   WAITMS(250)
END_CYC
« Last Edit: August 04, 2019, 05:54:41 PM by Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Riversong

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Спасибо Космич. Попробовал использовать DEFINE и кажется всё работает корректно  :)