2010-02-22 6 views
1

Je suis en train de programmer un jeu en utilisant pygame. J'ai l'intention de contrôler l'un des caractères en utilisant OpenSoundControl (OSC), un protocole basé sur udp pour la communication en temps réel. Fondamentalement, j'utilise simpleOSC module pour biund certaines commandes OSC à des fonctions sur mon programme pygame.Pygame et filetage: verrouillé lors de l'accès aux globals?

Ma structure de jeu est quelque chose comme ça (ce qui est une simplification si vous obtenez l'idée):

globalsomething = {} 

def handler(*m): 
    global globalsomething 
    print "it works" 
    print globalsomething 
    print "not working" 

if __name__ == "__main__": 
    osc.init() 
    osc.listen('', 3333) 
    osc.bind(handler,'/game/dosmtng') 
    app = Game() 
    while True: 
     app.MainLoop() 

jeu est une classe simple qui exécute pygame.init() et dessine et fait tout à peu près connexes à pygame. Le problème que j'obtiens en exécutant le code est que quand j'envoie un paquet osc je reçois "Ça marche" mais pas "ne fonctionne pas" et ensuite aucun paquet osc suivant n'est traité. Puisque simpleOSC utilise des threads, ma seule explication à ce comportement est que pygame utilise une sorte de threading incompatible (?) Et qu'il essaye d'accéder à une variable située dans le thread de pygame.

Des idées sur la cause et (si possible) une solution?

+0

En ce moment j'utilise une solution: j'ai piraté le code simpleOSC pour utiliser des sockets non bloquantes et arrêter d'utiliser des threads. C'est une solution laide mais ça marche. Mais j'aimerais en trouver une plus propre. –

Répondre

3

Je ne peux pas vérifier si vous avez effectivement un problème de thread/concurrence, bien que cela semble probable. Je peux suggérer une solution qui pourrait le résoudre.

Le module de multi-traitement python montre comment générer un nouveau processus (pas un thread) avec une file d'attente. Si vous créez le nouveau processus puis initiez OSC et que le gestionnaire place simplement un message dans la file d'attente chaque fois que quelque chose arrive, vous pouvez interroger la file d'attente depuis le processus principal de pygame pour obtenir les messages entrants.

C'est un peu moins propre que vous ne le souhaiteriez, mais au moins, les deux modules seront à bout de bras pour ne pas interférer les uns avec les autres.

+0

Cela semble être une bonne idée! Je ne connaissais pas le module multi-traitement! Pensez-vous que je pourrais utiliser multiprocessing.Value pour partager des données au lieu d'utiliser multiprocessing.Queue? –

+0

J'ai implémenté l'option Process + Queue et fonctionne parfaitement! Merci! –