Python - 寻找一种方法来阻止在无限循环中临时调用函数

时间:2011-05-03 08:18:09

标签: python sikuli

我有一个while循环作为我的主要功能。在其中我检查几个IF语句并相应地调用函数。一个特殊的功能,如果它已经在最后两分钟内运行,我不想打电话。我不想在函数中放置WAIT()语句,因为我希望在那段时间内执行其他IF测试。

在尝试暂停myFunction()

之前,代码就是这样的
while not(exit condition):
    if(test):
        otherFunction()
    if(test):
        otherFunction()
    if(test):
        myFunction()

我希望myFunction()每两分钟最多运行一次。我可以在其中放置一个等待(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),我似乎无法跟踪执行情况,看看它是如何执行的。

2 个答案:

答案 0 :(得分:2)

我认为你基本上是在正确的轨道上,但这是我实现它的方式:

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 :(得分:0)

您始终将“now”设置为当前时间。在else分支中,您始终将“then”设置为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