2012-06-20 2 views
3
def On_Instrumentation_StartAnimation(): 

    """ 
    Syntax  : On_Instrumentation_StartAnimation() 
    Purpose  : Fired if the animation is started 
    Parameters : None 
    """ 
    print "----------------------------------------------------------------------------------------" 
    localtime = time.asctime(time.localtime(time.time())) 
    global start 
    start = time.clock() 
    print "The user entered Animation Mode at local time: ", localtime 
    print("This data has also been written to 'c:\dSPACE71\cdlog\cdlog.txt'") 
    threading.Timer(2, ExecuteDemo).start() 
    ExecuteDemo() 
    # Printing to the text file 
    file1 = open('c:\dSPACE71\cdlog\cdlog.txt', 'a') 
    file1.write("\n----------------------------------------------------------------------------------------") 
    file1.write("\nThe user entered Animation Mode at local time: ") 
    file1.write(localtime) 
    file1.close()  

def ExecuteDemo() 
    . 
    . 
    . 
    Current_value = Current.Read() 
    localtime = time.asctime(time.localtime(time.time())) 
    print "The current reading at localtime:", localtime, "is", str(Current_value) + "." 
    # Printing to the text file 
    file1 = open('c:\dSPACE71\cdlog\cdlog.txt', 'a') 
    file1.write("\n----------------------------------------------------------------------------------------") 
    file1.write("\nThe current reading at localtime: ") 
    file1.write(localtime) 
    file1.write(" is: ") 
    file1.write(str(Current_value)) 
    file1.close() 
    . 
    . 
    . 

Как вы можете надеяться, я пытаюсь повторить функцию ExecuteDemo() каждые 2 секунды после вызова функции StartAnimation. Но моя проблема здесь в том, что мой ExecuteDemo() работает только дважды. Как я могу заставить его продолжать повторять? Я что-то упускаю?Python threading.Timer повторяется только один раз

ответ

11

Из документации:

класс threading.Timer

Поток, который выполняет функцию по истечении заданного интервала прошло.

Это означает, что Threading.Timer будет вызывать функцию после определенного периода времени. И, как вы заметили, его вызывают только один раз. Решение здесь будет иметь таймер, установленный еще раз в конце функции ExecuteDemo(..).

def ExecuteDemo(): 
    . 
    . 
    . 
    threading.Timer(2, ExecuteDemo).start() 

На мой взгляд, выше метод немного неэффективно. Кажется, что каждые две секунды создается новый поток, и как только он выполняет эту функцию, он умирает перед созданием следующего потока.

Я хотел бы предложить что-то вроде этого:

def ExecuteDemoCaller(): 
    #while True: # or something.. 
    while someCondition: 
     ExecuteDemo() 
     time.sleep(2) 
+1

+1 для 'в то время как True:' подхода. На мой взгляд, это намного больше, чем Pythonic, и гораздо более выразительное намерение, которое должно циклироваться бесконечно. 'while breakCondition:' также будет иметь смысл, предполагая, что 'ExecuteDemo' может изменить значение, хранящееся там. –

+0

@ g.d.d.c Причина, по которой у меня есть # или что-то там :) – SuperSaiyan

+0

+1 по тем же причинам. Тем не менее, стоит отметить, что все предлагаемые решения имеют одну и ту же проблему: она не будет составлять 30 итераций в минуту, она будет всегда медленнее. Единственный способ - использовать функцию спящего режима, с временной меткой, которую вы всегда увеличиваете на 2 секунды. – abarnert

1

От docs:

класс threading.Timer (интервал, функция, арг = [], kwargs = {}) ¶ Создать таймер, который будет работать функция с аргументами args и ключевое слово аргументы kwargs, после Интервал секунд.

Я ничего не мог найти о повторном вызове. Может быть, у кого-то есть лучший ответ, или, может быть, вам придется делать это вручную (что было бы не слишком сложно).

0

Таймер не повторяется. Вы можете просто установить еще один таймер в конце вашей функции обратного вызова.

0
class setInterval(threading.Thread): 
def __init__(self, interval, function, args=[], kwargs={}): 
    threading.Thread.__init__(self) 
    self.interval = interval 
    self.function = function 
    self.args = args 
    self.kwargs = kwargs 
    self.finished = threading.Event() 
    self.flag_run = True 
def cancel(self): 
    self.finished.set() 
def run(self): 
    while self.flag_run: 
    self.finished.wait(self.interval) 
    if not self.finished.is_set(): self.function(*self.args, **self.kwargs) 
    else: self.flag_run = False 
    self.finished.set() 

Через 10 минут чтения "threading.py" Я использую этот код

Смежные вопросы