Author Topic: окончание скрипта по времени  (Read 3982 times)

0 Members and 1 Guest are viewing this topic.

Mr.Ivan

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
окончание скрипта по времени
« on: February 15, 2021, 01:30:23 PM »
Добрый день!
Подскажите вот что. Скрипт работает по кругу, пока не остановишь вручную.
А есть ли какая-то команда, чтобы она работал много-много раз, пока не наступит скажем 2 часа ночи? В это время он выключается и всё.

intro

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: окончание скрипта по времени
« Reply #1 on: February 15, 2021, 03:14:31 PM »
В меню Команды есть раздел Системные переменные, там есть нужные команды.
В самом конце скрипта нужно вставить такую проверку времени.
Code: (clickermann) [Select]
IF($_time_h >= 2) // если время 2 часа ночи, или больше
   HALT(1) // стоп и закрыть кликер
END_IF

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: окончание скрипта по времени
« Reply #2 on: February 15, 2021, 11:47:20 PM »
Quote
IF($_time_h >= 2) // если время 2 часа ночи, или больше

То есть скрипт будет работать всего два часа, с 12  до двух ночи.  Остальное время  > либо = двум.

Правильно - IF($_time_h = 2).



Если полное выполнение скрипта может длиться больше часа, что мало вероятно, то можно выкинуть условие в отдельный поток с установкой флага финишного выполнения:
Code: (clickermann) [Select]
THREAD(finish, 1)
   IF($_time_h = 2) // если время 2 часа ночи
      $end_work = 1 // запоминаем, что пора спать
      SETTHREAD (finish, 0) // отключаем поток
   END_IF
   wait(5)
END_THREAD

// основной скрипт
//...............
//...............
//...............


//в конце
IF($end_work = 1) // проверяем, пора ли спать
   HALT(1) // стоп и закрыть кликер
END_IF

Mr.Ivan

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Re: окончание скрипта по времени
« Reply #3 on: February 16, 2021, 11:40:08 AM »
Большое спасибо. Испытаю

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: окончание скрипта по времени
« Reply #4 on: February 16, 2021, 12:58:38 PM »
 Основная ошибка это знак >=. Представь, что мне нужно выключить скрипт в 12 ночи. В таком условии кликер сразу вырубится, и не важно сколько времени. Правильный знак в условии должен быть = .
« Last Edit: February 16, 2021, 08:14:54 PM by dramster »

intro

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: окончание скрипта по времени
« Reply #5 on: February 16, 2021, 06:53:07 PM »
Основная ошибка это знак >=. Представь, что мне нужно выключить скрипт в 12 ночи. В таком условии кликер сразу вырубится, и не важно сколько времени. Правильный знак в условии должен быть = .

Спасибо за подсказку, мне с этими знаками >= сразу понятно было, хотелось как то обойти ограничение на 1 час работы скрипта. Мой утренний скрипт с такой же проблемой, не работает если цифра времени старта больше цифры времени отключения скрипта. Идея со смещением времени не оправдалась. Свой неправильный пост выше удаляю.
Сейчас еще поковырял немного и бросил, даже если что-то и получится, то этот скрипт будет больше основного. В итоге, исправляю >= на = и заканчиваю "помогать". ;D

Ничего лучше этого у меня пока не получилось:
Code: (clickermann) [Select]
//-------------------------
WAIT(1) // основной скрипт
//-------------------------

IF($_time_h = 2) // если время 2 часа ночи
   HALT(1) // стоп и закрыть кликер
END_IF

Code: (clickermann) [Select]
THREAD(name, 1)
   IF($_time_h = 2) // если время 2 часа ночи
      HALT(1) // стоп и закрыть кликер
   END_IF
   WAIT(5)
END_THREAD

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: окончание скрипта по времени
« Reply #6 on: February 16, 2021, 09:28:32 PM »
...хотелось как то обойти ограничение на 1 час работы скрипта.

Так  вот и мне хотелось, простейшим вариантом был поток.
Но мы же так просто не сдаемся!?
Немного усложнил задачу и добавил остановку по часу и минуте. И не важно сколько времени длится скрипт. Не используя отдельный поток.

Изначально расчеты взял отсюда http://crapware.aidf.org/forum/index.php?topic=5210.msg33805#msg33805

Code: (clickermann) [Select]
//вводим вручную время остановки, час и минуту
$end_h = 2 // час остановки
$end_m = 0  // минута остановки

//рассчет время окончания в юникс
IF($end_time_unix = 0)
   IF(int(($date_y-1968)/4) = ($date_y-1968)/4)
      STRSEPARATE ("31,29,31,30,31,30,31,31,30,31,30,31", ",", $month)
   ELSE
      STRSEPARATE ("31,28,31,30,31,30,31,31,30,31,30,31", ",", $month)
   END_IF
   FOR($a=0,$a<$_date_m-1)
      $all_md  = $month[$a] + $all_md
   END_CYC
   IF($_time_h > $end_h)
      $end_time_unix =(($_date_y-1970)*365+int(($_date_y-1969)/4))*86400 + $all_md*86400 + $_date_d*86400 + $end_h*3600 + $end_m*60
   ELSE
      $end_time_unix =(($_date_y-1970)*365+int(($_date_y-1969)/4))*86400 + $all_md*86400 + ($_date_d-1)*86400 + $end_h*3600 + $end_m*60
   END_IF   
END_IF
//----------------------

// основной скрипт
//...............
//...............
//...............






//в конце
IF($_time_t >= $end_time_unix)//если реальное время больше назначенного выше
   halt(1)  // стоп и закрыть кликер
END_IF

intro

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: окончание скрипта по времени
« Reply #7 on: February 17, 2021, 05:06:36 PM »

Круто конечно. Мне такое даже осмыслить пока будет трудно. Но попробую в этом разобраться, пригодится.
С временем юникс тоже вчера пробовал экспериментировать, но потом отказался. Мне показалось, что я слишком углубился и полез в дебри, и что всё должно быть гораздо проще. Закончил свои вчерашние опыты на сравнении вот таких строк.

Code: (clickermann) [Select]
LOGWRITE (STRFILTER(STRCONCAT($_date_str, $_time_str), ":.", 0)) // 17022021162947
В таком сравнении >= тоже будет работать. Кажется, что надо то всего дождаться когда такая строка совпадет с указанным временем остановки скрипта. Само время остановки можно собрать в строку из отдельных элементов $_date_y, $_date_m, $_time_m,... Лишние разряды, такие как секунды, можно отбросить сразу, или динамически, или на основании настроек. Мне кажется это перспективным. Будет время, продолжу. Может и у меня получится сделать универсальный таймер. :)

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: окончание скрипта по времени
« Reply #8 on: February 17, 2021, 05:38:24 PM »
Да, вполне рабочий вариант, и намного проще и понятнее выйдет при использовании.
Только нужно учитывать, что число 17022021162947 очень большое, за пределами 4 байт. Не известно как такие числа будут вести себя в скрипте, скорее всего все будет норм. 


intro

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: окончание скрипта по времени
« Reply #9 on: February 18, 2021, 10:26:17 AM »
Вот такая хреновина получилась. ;D
Большие числа не мешают, только INT иногда почему то приписывает к этим числам дробную часть (как и ROUND), но это ни на что не влияет.
Устанавливать время отключения в этом таймере не удобно, нужно соблюдать формат. Для удобства вставил разделители " :.", но все равно можно легко ошибиться. Зато можно установить любое время, с точностью до секунды.

Code: (clickermann) [Select]
DEFINE($stop_time, "2021.02.19 02:00:00") // время отключения кликера (год.месяц.число часы:минуты:секунды)

WAIT(1) // основной скрипт

IF(INT(STRCONCAT($_date_y, STRCONCAT(STRCUT("00", 1, 2-STRLEN($_date_m)), $_date_m), STRCONCAT(STRCUT("00", 1, 2-STRLEN($_date_d)), $_date_d), STRCONCAT(STRCUT("00", 1, 2-STRLEN($_time_h)), $_time_h), STRCONCAT(STRCUT("00", 1, 2-STRLEN($_time_m)), $_time_m), STRCONCAT(STRCUT("00", 1, 2-STRLEN($_time_s)), $_time_s))) >= INT(STRFILTER($stop_time, " :.", 0)))
   HALT(1) // стоп и закрыть кликер
END_IF

Что то мне кажется, что зря я вчера забраковал свой вариант со смещением времени, он интересней и я его просто не дожал. В том варианте таймер устанавливается на 24 часа максимум, что обычно и требуется.