2012-05-16 5 views
0

J'essaie d'exécuter une simulation physique (en utilisant ODE) dans une application wxPython. Ma première tentative a couru ma simulation à 100Hz en utilisant une minuterie, mais cela fonctionnait à quelque chose de plus proche de 60Hz. Il est important que le taux de la simulation soit précis, j'ai donc écrit un petit thread qui a dormi pendant 0.01 secondes, puis envoyé un message (via wx.PostEvent) au thread principal de l'interface utilisateur qui a exécuté la simulation. Ceci a complètement bloqué l'application, et à partir de la journalisation, je peux voir que tous les événements que j'envoie (à 100Hz) ne sont pas traités. Je présume donc que je remplis la file d'attente des messages et que mon interface utilisateur s'arrête.Chronométrage haute résolution dans wx.Python

Lorsque je règle mon thread à 50Hz, tout fonctionne correctement. Mais je veux dire, nous sommes en 2012 et j'ai huit cœurs qui fonctionnent à un nombre absurde de gigahertz ou quoi que ce soit. Il ne me semble pas qu'un 100Hz précis demande tant de choses. Il doit seulement être précis à long terme, une certaine gigue (disons 10%) est parfaitement bien.

Des idées? Voici mon code de fil par la façon dont

def TimerThreadFunction(self): 
    while self.ContinueTimer: 
     time.sleep(0.01) 
     wx.PostEvent(self.frame, TickEvent()) 

Répondre

0

Si c'est seulement une simulation en temps réel, vous pouvez régler les secondes de sommeil pour chaque étape en utilisant le temps total de simulation:

import time 

def sim_step(): 
    import random 
    for i in xrange(random.randint(1000, 10000)): 
     pass 

start = time.time() 
sim_time = 0 
while True: 
    sim_step() 
    sim_time += 1 
    to_sleep = max(0, sim_time*0.001 - (time.time() - start)) 
    time.sleep(to_sleep) 
    if sim_time % 1000 == 0: 
     print sim_time, time.time() 
+0

Mais le vrai problème est le fait que Je n'arrive pas à envoyer mes messages à près de 100Hz, ce qui me semble absurde. Une fois que j'aurai commencé, je peux essayer votre approche pour synchroniser mon temps simulé et mon temps réel. –

Questions connexes