2011-10-07 4 views
0

c'est une minuterie dans un jeu je programmé:minuterie en Python pour un jeu

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,)) 

est-il une meilleure façon d'écrire cela? pour moi, il semble un peu sale appeler une fonction récursive et un nouveau thread ... De plus, il se bloque après un certain temps ...

+0

Cela peut vous aider: http://stackoverflow.com/questions/156330/get-timer-ticks-in-python – GoingTharn

+0

Vous essayez d'atteindre une minuterie retardée? Dans cet exemple, une fois que le temps dépasse 0,7, il exécutera constamment votre code répétitif, jusqu'à ce que vous ayez de nouveau touché la valeur tx1, qui devra être protégée car sa mémoire partagée – jdi

+0

@jdi juste une minuterie qui après le millisecondes fait le répétitif fonctions – Pella86

Répondre

3

Votre exemple actuel se heurte à la question des limites de récursion, en raison de la façon dont il appelle lui-même de manière récursive. La taille de la pile continue de croître et de croître jusqu'à atteindre la valeur par défaut de 1000, très probablement. Voir cet exemple modifié:

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 ... 

Son probablement plus facile d'utiliser une classe personnalisée de fil qui peut fonctionner jusqu'à ce que vous lui dites d'arrêter. De cette façon, la taille de la pile ne continue pas à augmenter. Il boucle juste et appelle votre fonction de gestionnaire. Voici un exemple complet de travail:

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

cela ne fonctionne pas, j'ai essayé d'utiliser votre syntaxe ... et il ne rafraîchit pas de toile chaque 0,2 secondes, il le fait une seule fois ... – Pella86

+0

@ Pella86: J'ai révisé ma réponse pour répondre à cette question , avec plus de détails sur le problème. – jdi

+0

Thx vous: D ça marche! – Pella86