2012-05-16 53 views
0

我試圖在wxPython應用程序中運行物理模擬(使用ODE)。我第一次嘗試使用計時器以100Hz運行我的模擬,但實際上它運行在接近60Hz的頻率。模擬的速率非常重要,所以我編寫了一個睡眠時間爲0.01秒的小線程,然後(通過wx.PostEvent)向運行(並呈現)模擬的主UI線程發送消息。wx.Python中的高分辨率時序

這完全掛起了應用程序,並且從日誌記錄中我可以看到並非所有正在發送的事件(以100Hz)正在處理中。因此,我認爲我正在填充消息隊列,並且我的用戶界面停止了。

當我設置我的線程運行在50Hz時,所有工作正常。但我的意思是,這是2012年,我有八個內核運行在一個荒謬的千兆赫茲或其他任何數量。在我看來,精確的100Hz並不是很重要。從長遠來看,它必須是準確的,一些抖動(比方說10%)完全沒問題。

任何想法?這裏是由順便

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

回答

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

但真正的問題是事實,我甚至無法在接近100Hz時發送我的消息,這看起來很荒唐。一旦我開始了,我可以嘗試你的方法來保持我的模擬時間和實時同步。 –