wx.Python中的高分辨率计时

时间:2012-05-16 02:39:30

标签: python timing wxwidgets

我正在尝试在wxPython应用程序中运行物理模拟(使用ODE)。我的第一次尝试是使用计时器以100Hz运行我的模拟,但是这实际上是在接近60Hz的情况下运行。重要的是模拟的速度是准确的,所以我写了一个小的线程,睡眠时间为0.01秒,然后发送一条消息(通过wx.PostEvent)到运行(和渲染)模拟的主UI线程。 p>

这完全挂起了应用程序,从日志记录中我可以看到并非所有正在发送的事件(100Hz)正在处理中。因此,我认为我正在填写消息队列,我的UI会停止运行。

当我将线程设置为以50Hz运行时,一切正常。但我的意思是,这是2012年,我有八个核心运行在一些荒谬的千兆赫兹或其他什么。在我看来,准确的100Hz并不是那么多。从长远来看,它只需要准确,一些抖动(假设10%)完全没问题。

有什么想法吗?这是我的线程代码

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

1 个答案:

答案 0 :(得分:0)

如果只是实时模拟,您可以使用总模拟时间调整每个步骤的睡眠时间:

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