2012-07-11 54 views
3

我是新來的,這是我的第一個問題。我在Python 3.2.3中做了一個遊戲,我遇到了一個問題,那就是Timer對象在調用start()方法後有時會崩潰解釋器(它發生的時間就像是50%的時間,總會有一個錯誤窗口說: Python停止工作,不得不被終止)。Python定時器崩潰解釋器

我已經簡化了我的代碼,這樣我就可以找到問題,我發現這個非常簡單的代碼崩潰我的翻譯:

from threading import Timer 

def hello(): 
    print("hello, world") 

t = Timer(1.0, hello) 
t.start() 

我試着修理我的Python安裝目錄,這沒」工作。我在Windows 7下運行Python,不幸的是,到目前爲止還沒有機會嘗試其他操作系統,所以如果任何人有任何關於此問題的經驗,我將不勝感激任何解決方案。感謝大家。

+0

這裏沒有錯誤,使用Python 3.2.3在Windows 7 – 2012-07-11 12:22:50

+0

這簡化版本崩潰的100%的時間?在Windows 7下,我無法讓v2.7.2或3.2.3崩潰。在Linux下(在VirtualBox VM中)也可以使用v 2.6.5 – Levon 2012-07-11 12:23:04

+0

適用於OSX 10.7.4 python 2.7.3 – GP89 2012-07-11 12:43:03

回答

1

我重建了你的問題,你的代碼對我來說工作得很好。 你可能想考慮使用時間庫?

from time import sleep 
def hello(): 
    print('hello world') 
sleep(1) 
hello() 

這可能是一個更安全的解決方案,但我建議你更新你的操作系統並重新安裝python。試圖與python2.7?

+0

睡眠障礙傢伙.... – 2012-07-11 12:28:27

+0

我還沒有嘗試過Python 2.7,但我會盡快做到,會讓你知道結果。我不能使用睡眠,因爲我需要它是多線程的,遊戲必須在計時器等待並觸發事件時運行。 – 2012-07-11 14:04:43

1

在腳本結束後,不應該留下線程或定時器。但是,我甚至不能確定的是,以下,是不會受到這個問題,將您的系統上運行可靠:

# This is NOT the suggested fix 

from threading import Timer 

def hello(): 
    print("hello, world") 

t = Timer(1.0, hello) 
t.start() 
sleep(2)  

爲什麼其他人試圖複製不吃虧的問題的原因是,它們運行的腳本作爲一個獨立的進程,並且該計時器在該進程退出時未被操作系統註冊,而您正在使用交互模式。

真正的解決方案是停止使用交互模式來處理定時器和線程。

更多背景here

+0

我試過這段代碼,它仍然崩潰,我也嘗試刪除腳本結束時的Timer對象,仍然無法工作。我通過命令行將腳本作爲新的進程運行,而不是以交互模式運行。猜猜我只需要重新安裝一切,看看它是否有效。 – 2012-07-11 14:12:24

+0

@MiloslavČíž - 我很遺憾聽到 - 是的,如果沒有,請在操作系統上標記問題,並指出涉及的Python和操作系統的確切版本以及崩潰的確切症狀(就像錯誤信息)。 – 2012-07-11 14:20:43

1

所以問題解決了,重新安裝Python幫助。然而,修復安裝沒有,這可能是一件好事。謝謝你的幫助。