2014-07-25 3 views
0

Je veux faire un petit lecteur de musique en ligne de commande basé sur le module python "mp3play". Je veux vérifier régulièrement, si une chanson a cessé de jouer (et éventuellement commencer une nouvelle chanson), mais l'utilisateur devrait être en mesure de taper de nouvelles commandes pendant ce temps (comme mettre la musique en pause). Pour cela, j'ai essayé d'utiliser threading.Timer pour cela. Cependant, il me donne une erreur si je suis à l'intérieur de la fonction qui a été appelée en utilisant la minuterie. l'erreur ne se produit pas lorsque la fonction a été appelée normalement. Heres mon (réduit) Code:(python) Comportement différent lors de l'appel à l'aide de threading.Timer

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 

Quand représentant() est appelée la deuxième fois, il me donne une erreur MCI dans la fonction isPlaying(), en disant qu'il ne peut pas lire le périphérique. Mes questions:
Est-ce que je fais une erreur avec la façon dont le threading.Timer fonctionne? (et comment puis-je le réparer?) Existe-t-il un autre moyen que l'enfilage. Temporisateur pour réaliser ce que je veux?
Mes pensées jusqu'ici étaient, que ce pourrait être un problème pour accéder à currentmusic d'un autre fil, mais je ne suis pas sûr. Aussi, je ne sais pas comment l'éviter.
Thx pour aider

+0

C'est probablement un problème de threading, comme vous le suspectez. Puisque cela ressemble à un projet abandonné depuis longtemps et qui n'a jamais dépassé la version 0.3 que personne d'autre n'utilise, espérez-vous le réparer vous-même? Ou à la recherche d'une solution de contournement pour que vous n'en ayez pas besoin? – abarnert

+0

Aussi, quel est votre fil principal supposé faire ici? Il démarre 'rep', puis se termine juste. Ce qui se passe dans ce cas est spécifique à la plate-forme, mais je pense que dans Windows, le thread principal se bloque jusqu'à ce que le thread d'arrière-plan se termine, ce qui ne semble pas très utile. La façon de contourner ce problème (si c'est votre objectif) est de faire en sorte que le thread d'arrière-plan signale le thread principal au lieu de le faire directement, mais sans savoir ce que fait le thread principal, je ne peux pas l'expliquer davantage. – abarnert

Répondre

0

Ive utilisé mp3play dans certains projets, et cela fonctionne très bien pour moi. Filetage de récursion IMO est le problème. Retirez simplement le minuteur de filetage et laissez l'appel de la fonction rep, il ne sera pas en retard sur n'importe quel PC. Vous devez utiliser le thread uniquement pour raw_input.

Questions connexes