#python #sikuli
#python #sikuli
Вопрос:
у меня есть цикл while в качестве моей основной функции. в нем я проверяю несколько операторов IF и вызываю функции соответствующим образом. одну конкретную функцию я не хочу вызывать, если она уже была запущена в течение последних двух минут. я не хочу помещать оператор WAIT() в функцию, потому что я хочу, чтобы другие тесты IF выполнялись в течение этого времени.
код выглядит примерно так перед любой попыткой приостановить myFunction()
while not(exit condition):
if(test):
otherFunction()
if(test):
otherFunction()
if(test):
myFunction()
я хочу, чтобы myFunction () запускалась не чаще одного раза в две минуты. я мог бы поместить в него wait (120), но это предотвратило бы вызов OtherFunction() в это время.
я пытался
import time
set = 0
while not(exit condition):
if(test):
otherFunction()
if(test):
otherFunction()
if(test):
now = time.clock()
diff = 0
if not(set):
then = 0
set = 1
else:
diff = now - then
if (diff > 120):
myFunction()
then = now
безуспешно. не уверен, правильный ли это подход, и если да, то корректен ли этот код. я впервые работаю на Python (на самом деле Sikuli), и, похоже, я не могу отследить выполнение, чтобы увидеть, как это выполняется.
Комментарии:
1.
set
неверное имя переменной. Это маскируетset()
команду.
Ответ №1:
Я думаю, что вы в принципе на правильном пути, но вот как я бы это реализовал:
import time
MIN_TIME_DELTA = 120
last_call = time.clock() - (MIN_TIME_DELTA 1) # init to longer than delta ago
while not exit_condition:
if test:
otherFunction()
if test:
anotherFunction()
if test and ((time.clock()-last_call) > MIN_TIME_DELTA):
last_call = time.clock()
myFunction()
Редактировать
Вот слегка оптимизированная версия:
next_call = time.clock() - 1 # init to a little before now
while not exit_condition:
if test:
otherFunction()
if test:
anotherFunction()
if test and (time.clock() > next_call):
next_call = time.clock() MIN_TIME_DELTA
myFunction()
Комментарии:
1. спасибо за ваше решение. я впервые использую stack overflow, и я в восторге от того, что могу воспользоваться вашим опытом. — Antikythera
2. @Anti: Ты welcome…to ИТАК. Кстати, в Python, в отличие от многих других языков программирования, вам, вероятно, не нужно заключать в круглые скобки
test
, т.е. простоif test
илиif test and ...
— они не причиняют вреда, но это довольно наивно.
Ответ №2:
Вы всегда устанавливаете «now» на текущее время. В ветке else вы всегда устанавливаете «тогда» на now. Таким образом, diff — это всегда время, прошедшее между двумя последними исполнениями предложения if. Значение «set» изменяется только в вашем коде и никогда не возвращается к «0».
Вместо этого вы могли бы сделать что-то вроде этого (предупреждение: непроверенный код):
import time
set = 0
last_call_time = time.clock()
while not(exit condition):
if(test):
otherFunction()
if(test):
otherFunction()
if(test):
now = time.clock()
diff = now - last_call_time
if (diff > 120)
myFunction()
last_call_time = now