2016-11-30 3 views
2

Следующая программа печатает привет миру только один раз, вместо этого она должна печатать строку каждые 5 секунд.Таймер запускается только один раз в python

from threading import Timer; 

class TestTimer: 

    def __init__(self): 
     self.t1 = Timer(5.0, self.foo); 

    def startTimer(self): 
     self.t1.start(); 

    def foo(self): 
     print("Hello, World!!!"); 

timer = TestTimer(); 
timer.startTimer(); 


         (program - 1) 

Но следующая программа печатает строку каждые 5 секунд.

def foo(): 
    print("World"); 
    Timer(5.0, foo).start(); 

foo(); 

         (program - 2) 

Почему (программа - 1) не печатает строку каждые 5 секунд?. И как заставить (program-1) печатать строку каждые 5 секунд непрерывно.

+0

Зачем вы его обертываете в дополнительный класс? Это необходимо? – nlsdfnbch

ответ

1

(program - 2) печатает строку каждые 5 секунд, потому что она вызывает себя рекурсивно. Как вы можете видеть, вы вызываете функцию foo() внутри себя, и это причина, потому что она работает.

Если вы хотите напечатать строку каждые 5 секунд в (программе - 1), используя класс, который вы могли бы (но это не очень хорошая практика!):

from threading import Timer 

class TestTimer: 
    def boo(self): 
     print("World") 
     Timer(1.0, self.boo).start() 

timer = TestTimer() 
timer.boo() 
0

Как уже отмечалось, вы «повторно вызвав foo() рекурсивно:

def foo(): 
    print("World"); 
    Timer(5.0, foo).start(); # Calls foo() again after 5s and so on 

foo(); 

В вашем вопросе, вы создали обертку вокруг threading.Timer - я предлагаю вам просто подкласс:

from threading import Timer 

class TestTimer(Timer): 

    def __init__(self, i): 
     self.running = False 
     super(TestTimer, self).__init__(i, self.boo) 

    def boo(self): 
     print("Hello World") 

    def stop(): 
     self.running = False 
     super(TestTimer, self).stop() 

    def start(): 
     self.running = True 
     while self.running: 
      super(TestTimer, self).start() 

t = TestTimer(5) 
t.start()