2014-07-25 43 views
0

我想製作一個基於python模塊「mp3play」的小命令行音樂播放器。 我想定期檢查一首歌是否停止播放(並最終開始新歌),但用戶應該能夠在那段時間輸入新的命令(如暫停音樂)。爲此,我嘗試使用threading.Timer。但是,如果我在使用計時器調用的函數內,它會給我一個錯誤。當函數正常調用時,錯誤不會發生。我的繼承人(減少)代碼:(python)使用線程調用時的不同行爲。定時器

from threading import Timer 
global currentmusic 

def rep(): 
    b = currentmusic.isplaying() #this is where the error occurs 
    if b: 
     print "Music is playing" 
    else: 
     print "Music has stopped" 
    t=Timer(5.0,rep) #repeat every 5 seconds 
    t.start() 
currentmusic=playrandomfile() #loads a song and starts playing it 
rep() #call the first time 

當代表()被稱爲第二次,它給我的功能IsPlaying模塊的MCI錯誤(),稱它無法讀取設備。我的問題:
我是否犯了threading.Timer工作方式的錯誤? (以及我如何解決它?) 是否有另一種方法比threading.Timer實現我想要的東西?
我的想法到目前爲止,這可能是一個問題從其他線程訪問currentmusic,但我不知道。我也不知道如何避免它。
Thx幫助

+0

這可能是一個線程問題,正如你懷疑的那樣。由於這看起來像一個長期被遺棄的項目,從來沒有超過0.3版本,沒有其他人使用,你是否希望自己修復它?或者正在尋找解決方法,所以您不需要? – abarnert

+0

另外,你的主線應該在這裏做什麼?它啓動'rep',然後退出。在這種情況下會發生什麼是平臺特定的,但我認爲在Windows中它只是意味着主線程掛起,直到後臺線程完成,這似乎不是很有用(也不會僅僅終止後臺線程)。解決這個問題的方法(如果這是你的目標)是讓後臺線程以某種方式發信號給主線程,而不是直接做這個工作,但是不知道主線程實際做了什麼,我無法進一步解釋。 – abarnert

回答

0

我在某些項目中使用了mp3play,它對我來說工作正常。 IMO遞歸線程是問題。 只需刪除線程計時器並離開rep函數調用,它不會延遲任何pc。 您應該只對raw_input使用線程。