Author Topic: Выполнение по времени  (Read 2607 times)

0 Members and 1 Guest are viewing this topic.

Evgeny 888

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Выполнение по времени
« on: July 15, 2018, 03:29:39 PM »
Добрый день, в программировании чистый лист, т.ч заранее извиняюсь за....
Набросал себе такое расписание, подпрограмма должна запускаться с 14:00 до 15:30 каждые 30 мин, и далее с 16:30 до 19:30 тоже самое
также 3 условия должны включиться в определённое время 16:00, 20:00 и 21:10. Что можно сделать проще и короче? Подскажите пжл.
Code: (clickermann) [Select]
[SUB(GOB) // подпрограмма
//=============================================
FOR($a=0, $a < 1)
EXECUTE("sound\police.wav")
 
   $time2=0
   $time2 = $_time_t + 600
   WHILE($time2 > $_time_t) //условие выпол-ся в теч 10 мин
   GETSCREEN
       
IF_PIXEL_IN(1450,500, 1550,620, 61951)
         LCLICK($_return1+rnd(147,151), $_return2+rnd(-1,2))
         SOUND("sound\virus_1.wav")
         print("attack")
         WAIT(1)
         LCLICK(1165,605) // 4 точка
         LCLICK(965,605)  // 3 точка
         LCLICK(965,650)  // 2 точка
         LCLICK(500,650)  // 1 точка
         WAIT(9)
        END_IF     
   
   END_CYC
print("end")
END_CYC
//=============================================
END_SUB

IF(($_time_h > 13)&($_time_h < 16)&($_time_m = 00)&($_time_s = 02))

   GOB()

END_IF

IF(($_time_h > 13)&($_time_h < 20)&($_time_m = 30)&($_time_s = 02))

   GOB()

END_IF

IF(($_time_h > 16)&($_time_h < 19)&($_time_m = 00)&($_time_s = 02))

   GOB()

END_IF


$var=0
IF(($_time_h = 16)&($_time_m = 00)&($_time_s = 02))
   $var=1
   #include "Захватчики.cms"
END_IF
WAITMS(500)

$var=0
IF(($_time_h = 20)&($_time_m = 00)&($_time_s = 02))
   $var=1
   #include "Море.cms"
END_IF


$var=0
IF(($_time_h = 21)&($_time_m = 10)&($_time_s = 02))
   $var=1
   #include "Поле_боя.cms"
END_IF
WAITMS(500)

HALT
]
« Last Edit: July 15, 2018, 07:45:24 PM by Oraven »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Выполнение по времени
« Reply #1 on: July 15, 2018, 08:10:17 PM »
Code: (clickermann) [Select]
IF(($_time_h = 14)&($_time_m = 0)&($run = 0)) // Разрешаем выполнение в 14:00
   $run = 1
END_IF
IF(($_time_h = 19)&($_time_m > 30)&($run = 1)) // Запрещаем выполнение в 19:30
   $run = 0
END_IF

IF(($time < $_time_t)&($run = 1))
   FOR($a=0, $a < 1)
      EXECUTE("sound\police.wav")
      $time2 = $_time_t + 600
      WHILE($time2 > $_time_t) //условие выпол-ся в теч 10 мин
         GETSCREEN
         IF_PIXEL_IN(1450,500, 1550,620, 61951)
            LCLICK($_return1+rnd(147,151), $_return2+rnd(-1,2))
            SOUND("sound\virus_1.wav")
            print("attack")
            WAIT(1)
            LCLICK(1165,605) // 4 точка
            LCLICK(965,605)  // 3 точка
            LCLICK(965,650)  // 2 точка
            LCLICK(500,650)  // 1 точка
            WAIT(9)
         ELSE
            WAITMS(50)
         END_IF
      END_CYC
      print("end")
   END_CYC
   $time = $_time_t + 1800 // Условие сработает снова через 30 минут
END_IF

$var=0
IF(($_time_h = 16)&($_time_m = 0)&($_time_s = 2))
   $var=1
   #include "Захватчики.cms"
END_IF
WAITMS(200)

$var=0
IF(($_time_h = 20)&($_time_m = 0)&($_time_s = 2))
   $var=1
   #include "Море.cms"
END_IF

$var=0
IF(($_time_h = 21)&($_time_m = 10)&($_time_s = 2))
   $var=1
   #include "Поле_боя.cms"
END_IF
WAITMS(200)

Evgeny 888

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Выполнение по времени
« Reply #2 on: July 17, 2018, 02:43:26 PM »
Добрый день, спасибо за ответ. Но у меня проблема с циклом через ** минут. здесь тестовый вариант ч/з 2 минуты. Не хотел беспокоить, тупо читал посты где указывалось что тема изъедена и т.п. после недельных экспериментов начало подбешивать. Делаю всё как спецы пишут, но на выходе фигня. Помогите - что не так. может прогу переустановить надо? у меня по логам период 3 минуты и 1 секунда, откуда они беруться?
Code: (clickermann) [Select]
IF($time1 < $_time_t) // условие должно сработать ч/з 2 мин
LOGWRITE ("start")
   
   
      $time2=0
      $time2 = $_time_t + 60
      WHILE($time2 > $_time_t) //условие выпол-ся в теч 1 мин
      GETSCREEN
       
IF_PIXEL_IN(1450,500, 1550,620, 61951)
         LCLICK($_return1+150, $_return2)
         LOGWRITE ("Атака")
         WAIT(1)
         LCLICK(1165,625) // 4 точка
         LCLICK(965,625)  // 3 точка
         LCLICK(965,625)  // 2 точка
         LCLICK(500,625)  // 1 точка
         WAIT(9)
        END_IF     
   
      END_CYC
      LOGWRITE ("end_1")
 
$time1 = $_time_t + 120
END_IF

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Выполнение по времени
« Reply #3 on: July 17, 2018, 03:23:07 PM »
В цикле нет задержки если пиксел не найден. В этом случаи частые вызовы GETSCREEN будут сильно нагружать процессор.
Добавь еще записи в лог.

Code: (clickermann) [Select]
IF($time1 < $_time_t) // условие должно сработать ч/з 2 мин
   LOGWRITE ("start")
   $time2 = $_time_t + 60
   $m = $_ms // засекаем время
   WHILE($time2 > $_time_t) //условие выпол-ся в теч 1 мин
      GETSCREEN
      IF_PIXEL_IN(1450,500, 1550,620, 61951)
         LCLICK($_return1+150, $_return2)
         LOGWRITE ("Атака")
         WAIT(1)
         LCLICK(1165,625) // 4 точка
         LCLICK(965,625)  // 3 точка
         LCLICK(965,625)  // 2 точка
         LCLICK(500,625)  // 1 точка
         WAIT(9)
      END_IF
      LOGWRITE ("Осталось: ", $time2-$_time_t, " сек")
      WAITMS(50)
   END_CYC
   LOGWRITE ("end_1")
   LOGWRITE ("Прошло: ", $_ms-$m, " мс")
   $time1 = $_time_t + 120
END_IF
HALT

Лог:
Code: [Select]
16:31:31 end_1
16:31:31 Прошло: 60880 мс

« Last Edit: July 17, 2018, 03:43:55 PM by Oraven »

Evgeny 888

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Выполнение по времени
« Reply #4 on: July 18, 2018, 05:29:32 PM »
Добрый день,
Загнал в ваш скрипт все свои действия, согл реальной ситуации, вырезал все звук эфф, добавил везде время ожидания.
И все равно скрипт работает с периодом 3 минут, против 2 заданных. по ходу в период добавляется время исполнения тела "в течении"
Где ошибка?
Code: (clickermann) [Select]
IF($time1 < $_time_t) // условие должно сработать ч/з 2 мин
   
LOGWRITE ("start")
   $time2 = $_time_t + 60
   $m = $_ms // засекаем время
   WHILE($time2 > $_time_t) //условие выпол-ся в теч 1 мин
      GETSCREEN
      IF_PIXEL_IN(1450,500, 1550,620, 61951)
         LCLICK($_return1+150, $_return2)
         LOGWRITE ("Атака")
         WAIT(1)
         DBLCLICK(500,490)  // 1 точка
         WAITMS(50)
DBLCLICK(965,630)  // 3 точка
         WAITMS(50)       
DBLCLICK(970,640)
         WAITMS(50)
DBLCLICK(975,650)  // 3 точка
         WAITMS(50)
         DBLCLICK(1160,640) // 4 точка
         WAITMS(50)
         DBLCLICK(1165,650) // 4 точка
         WAITMS(50)
DBLCLICK(1170,660)
         WAIT(9)
      ELSE
         WAITMS(50)
           
      END_IF
      LOGWRITE ("Осталось: ", $time2-$_time_t, " сек")
      WAITMS(50)
   
END_CYC
   LOGWRITE ("end_1")
   
   
$time1 = $_time_t + 120
END_IF

Evgeny 888

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Выполнение по времени
« Reply #5 on: July 19, 2018, 01:46:38 AM »
Спасибо что подсказали где ошибка, был бы очень признателен за правильный вариант. как вы уже догадались чего я добиваюсь от скрипта.

Evgeny 888

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Выполнение по времени
« Reply #6 on: July 19, 2018, 12:17:38 PM »
Кирилл, добрый день. Спасибо за то что возитесь со мной, я тут с утра тож набросал, не так элегантно как увас, но вроде работало. Но! и в моём и сейчас проверил в вашем варианте, присутствует 1 лишняя секунда в цикле ч/з 2 мин, и меня это беспокоит. Откуда она берётся и как от неё избавится?
Code: (clickermann) [Select]
IF($time1 < $_time_t) // условие должно сработать ч/з 2 мин
$time1 = $_time_t + 120   
LOGWRITE ("start")
   
   FOR($a=0, $a < 1)


      $time2 = $_time_t + 60
      WHILE($time2 > $_time_t) //условие выпол-ся в теч 1 мин
      GETSCREEN
        IF_PIXEL_IN(1450,500, 1550,620, 61951)
         LCLICK($_return1+150, $_return2)
         LOGWRITE ("Атака")
         WAIT(1)
         LCLICK(500,485)  // 1 точка
         WAITMS(50)
         LCLICK(500,495)  // 1 точка
         WAITMS(50)
         LCLICK(965,630)  // 3 точка
         WAITMS(50)     
         LCLICK(970,640)  // 3 точка
         WAITMS(50)
      LCLICK(975,650)  // 3 точка
         WAITMS(50)
         LCLICK(1160,640) // 4 точка
         WAITMS(50)
         LCLICK(1165,650) // 4 точка
         WAITMS(50)
         LCLICK(1170,660) // 4 точка
         WAIT(9)
        ELSE
         WAITMS(50)
        END_IF     
   
    END_CYC
    LOGWRITE ("end_1")

   END_CYC   

END_IF

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Выполнение по времени
« Reply #7 on: July 19, 2018, 01:48:05 PM »
проверил в вашем варианте, присутствует 1 лишняя секунда в цикле ч/з 2 мин, и меня это беспокоит. Откуда она берётся и как от неё избавится?
Как откуда, вот отсюда
Code: (clickermann) [Select]
LOGWRITE("Ожидание старта ", $time1-$_time_t, " сек")
WAIT(1) //частота проверок во время ожидания повторных стартов

Ждём 1 секунду между проверками.
Если нужна точность выше, нужно ставить там маленькую задержку и убирать LOGWRITE.

Почему kiril так написал? Для отладки и чтоб ты понял смотря в лог. А выводить в лог каждые 10 ms невозможно и всё засрётся, поэтому стоит 1 секунда.

P.S. А что делает чудо-цикл выполняемый один раз?
Code: (clickermann) [Select]
FOR($a=0, $a < 1) :o

« Last Edit: July 19, 2018, 01:49:52 PM by Vint »


Evgeny 888

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Выполнение по времени
« Reply #8 on: July 19, 2018, 02:32:58 PM »
Тоже здравствуйте.
Нет, вот скрипт от Кирилла с моими функционалами и убранными функциями по контролю (только старт цикла, атаки и конец "в течени") И лог где эта гадкая секунда к каждому циклу:(
Code: (clickermann) [Select]
IF($time1 < $_time_t)
   $time1 = $_time_t + 120   // условие должно сработать  повторно ч/з 2 мин
   $time2 = $_time_t + 60    //цикл выпол-ся в теч 1 мин
   LOGWRITE ("Старт")
   EXECUTE("sound\police.wav")
   
   WHILE($time2 > $_time_t)
      GETSCREEN (1450,500, 1550,620)
      IF_PIXEL_IN(1450,500, 1550,620, 61951)
         LCLICK($_return1+150, $_return2)
         LOGWRITE ("Атака")
         SOUND("sound\virus_1.wav")
         WAIT(1)
         LCLICK(500,485)  // 1 точка
         WAITMS(50)
         LCLICK(500,495)  // 1 точка
         WAITMS(50)
         LCLICK(965,630)  // 3 точка
         WAITMS(50)     
         LCLICK(970,640)  // 3 точка
         WAITMS(50)
      LCLICK(975,650)  // 3 точка
         WAITMS(50)
         LCLICK(1160,640) // 4 точка
         WAITMS(50)
         LCLICK(1165,650) // 4 точка
         WAITMS(50)
         WAIT(9)
      ELSE
         WAITMS(50)
      END_IF
     
   END_CYC
   LOGWRITE ("Конец_10")
   
END_IF

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Выполнение по времени
« Reply #9 on: July 19, 2018, 04:34:43 PM »
Ты удалил паузу для разгрузки процессора во время ожидания между $time1.
Но это к делу не относится.

Не нужно смотреть на время в файле лога. Точнее можно смотреть, только интерпретировать правильно.
Code: (clickermann) [Select]
$time1 = $_time_t + 120   // условие должно сработать  повторно ч/з 2 минключевое слово здесь "через", т.е. по истечении 120 секунд.
Внутрь условия мы не попадём, пока не прощёлкает 120 секунд, а когда попадём будет уже 121-я.
Т.к. в логе время с точностью до секунды, то всё правильно, началась уже 121-я секунда во время принта.

Допустим $_time_t = 1000.
Прибавляем 120, $time1 = 1000 + 120 = 1120.
Через ровно 120 секунд (пока последняя секунда не закончилась) $_time_t стало 1120, условие IF($time1 < $_time_t) будет проверяться в таком виде
IF(1120 < 1120)

1120 меньше 1120? Нет. IF выполнится на следующей секунде, когда сто двадцатая закончится и будет
Code: (clickermann) [Select]
IF(1120 < 1121) :)

Но и это ещё не всё. Если тебе нужна точность до 1 секунды то, как известно, нужно использовать единицы измерения более высокого порядка.
Значит нужно использовать переменную более точную, у нас это $_ms с милисекундами


Evgeny 888

  • Зашел в гости
  • *
  • Posts: 7
    • View Profile
Re: Выполнение по времени
« Reply #10 on: July 19, 2018, 04:44:43 PM »
Спасибо за внятное объяснение, просто думал что при увеличении периода будет расти погрешность, 2 минуты было для тестов. в реале 30 мин. и 1 сек там ничего не решает. Ещё раз благодарю