2011-10-07 61 views
0

這是一個遊戲編程,我裏面的定時器:定時器的Python爲一個遊戲

def function(event): 
    time.sleep(.2) 
    tx2 = time.time() 
    if tx2-tx1 > 0.7: 
     #do the repetitive stuff here 
    return function(1) 

tx1 = time.time() 

thread.start_new_thread(function,(1,)) 

有沒有更好的方式來寫這個? 對我來說似乎有點髒調用遞歸函數和一個新的線程... 而且它崩潰了一段時間後...

+0

這可能會幫助您:http://stackoverflow.com/questions/156330/get-timer-ticks-in-python – GoingTharn

+0

你們是不是要達到一個延遲計時器?在這個例子中,一旦時間超過0.7,它會不斷運行你的重複代碼,直到你再次觸及tx1值,這將需要保護,因爲它的共享內存 – jdi

+0

@jdi只是一個計時器,在tot毫秒後重複函數 – Pella86

回答

3

您當前的示例運行到的遞歸限制的問題,因爲它的方式調用本身遞歸地。堆棧大小繼續增長並增長,直到達到默認值1000,最有可能。看到這個變形例:

import time 
import inspect 
import thread 

tx1 = time.time() 

def loop(event): 
    print "Stack size: %d" % len(inspect.stack()) 
    tx2 = time.time() 
    if tx2-tx1 > 0.7: 
      print "Running code." 
    return loop(1) 

thread.start_new_thread(loop, (1,)) 
time.sleep(60) 

## OUTPUT ## 
Stack size: 1 
Running code. 
Stack size: 2 
Running code. 
... 
Stack size: 999 
Running code. 
Exception RuntimeError: 'maximum recursion depth exceeded in ... 

它可能比較容易使用,可以運行,直到你告訴它停止自定義Thread類。這樣堆棧大小不會繼續增長。它只是循環並調用你的處理函數。 下面是一個完整的工作例如:

import time 
from threading import Thread 

class IntervalTimer(Thread): 

def __init__(self, secs, func, args=(), kwargs={}): 
    super(IntervalTimer, self).__init__(target=func, args=args, kwargs=kwargs) 

    self.__interval = secs 
    self.__func = func 
    self.__args = args 
    self.__kwargs = kwargs 
    self.__exiting = False 

def run(self): 
    while not self.__exiting: 
     time.sleep(self.__interval) 
     self.__func(*self.__args, **self.__kwargs) 

def cancel(self): 
    self.__exiting = True 


def test(val): 
    print val 

if __name__ == "__main__": 
    t = IntervalTimer(2, test, args=("Hi",)) 
    t.start() 
    time.sleep(10) 
    t.cancel() 
+0

它不起作用,我試圖使用你的語法...它不刷新每個畫布.2秒,它只做一次... – Pella86

+0

@ Pella86:我修改了我的答案以解決這個問題,關於這個問題的更多細節。 – jdi

+0

Thx你:D它的工作! – Pella86