2014-07-25 4 views
0

파이썬 모듈 "mp3play"를 기반으로 약간의 명령 행 뮤직 플레이어를 만들고 싶습니다. 노래가 멈추고 (결국 새 노래를 시작하는 경우) 정기적으로 확인하고 싶지만 사용자는 그 시간 동안 (음악을 일시 중지하는 것처럼) 새 명령을 입력 할 수 있어야합니다. 그 때문에 나는 threading.Timer를 사용하려고했습니다. 그러나 타이머를 사용하여 호출 된 함수 안에 있다면 오류가 발생합니다. 함수가 정상적으로 호출 될 때 오류가 발생하지 않습니다. Heres는 내 (감소) 코드 :(파이썬) 스레딩을 사용하여 호출 할 때 다른 동작.

담당자()가 두 번째라고
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가 작동하는 방식으로 실수를하고 있습니까? (그리고 어떻게 해결할 수 있습니까?) 스레딩보다 다른 방법이 있습니까? 나는 원하는 것을 얻기 위해?
내 생각은 지금까지는 다른 스레드에서 currentmusic에 액세스하는 것이 문제가 될 수 있지만 확실하지 않습니다. 또한 나는 그것을 피하는 방법을 모른다.
도와 주신 Thy

+0

의심되는 것처럼 스레드 문제 일 수 있습니다. 이 버전은 아무도 사용하지 않는 0.3 버전을 넘어선 적이없는 오랫동안 버려진 프로젝트처럼 보이므로 직접 수정하려고하십니까? 또는 해결 방법을 찾을 필요가 없으므로 찾으십니까? – abarnert

+0

또한, 여기서하고있는 메인 스레드는 무엇입니까? 'rep'를 시작한 다음 종료합니다. 이 경우에는 플랫폼에 따라 다르지만 Windows에서는 백그라운드 스레드가 끝날 때까지 주 스레드가 멈추는 것을 의미합니다. 매우 유용하지는 않습니다 (백그라운드 스레드를 종료하는 것만 큼). 이 문제를 해결할 수있는 방법은 배경 스레드가 직접 작업을 수행하는 대신 주 스레드에 신호를 보내도록하는 것이지만 주 스레드가 실제로 무엇을하는지 모른 채 더 이상 설명 할 수 없습니다. – abarnert

답변

0

Ive는 일부 프로젝트에서 mp3play를 사용하며 저에게 잘 작동합니다. IMO 재귀 스레드가 문제입니다. 스레딩 타이머를 제거하고 rep 함수 호출을 그대로두면 모든 PC가 지연되지 않습니다. raw_input에만 스레딩을 사용해야합니다.