Frage

Ich programmiere ein Spiel pygame verwenden. Ich beabsichtige, eines des Zeichens zu steuern, unter Verwendung von Opensound (OSC), ein UDP-basierten Protokoll für Echtzeit-Kommunikation. Grundsätzlich verwende ich simpleOSC Modul einige OSC Befehle an Funktionen auf meinem pygame biund Programm.

Meine Spielstruktur ist so etwas wie diese (dies ist eine Vereinfachung, so dass Sie auf die Idee kommen):

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()

Spiel ist eine einfache Klasse, die ausgeführt wird pygame.init () und zieht und tut so ziemlich alles zu pygame Zusammenhang stehen.

Das Problem, das ich bekommen, wenn der Code ausgeführt wird, ist, dass, wenn ich ein osc-Paket senden ich „Es funktioniert“, aber nicht „funktioniert nicht“ und dann keine nachfolgende osc Pakete verarbeitet werden.

Da simpleOSC Threads verwendet, meine einzige Erklärung für dieses Verhalten ist, dass pygame eine Art unvereinbar Threading verwendet (?) Und wenn sie Zugriff auf eine Variable versucht, in pygame Thread befindet er einrastet.

Alle Ideen über die Ursache und (wenn möglich) eine Lösung?

War es hilfreich?

Lösung

Ich kann nicht überprüfen, ob Sie tatsächlich ein Thread / Concurrency Problem hat, obwohl es wahrscheinlich scheint. Ich kann eine Lösung vorschlagen, die es lösen kann.

Die Python-Modul Multiprozessing zeigt, wie ein neues Verfahren zum Laichen (kein Gewinde) mit einer Warteschlange. Wenn Sie den neuen Prozess und dann init OSC dort erstellen, und haben einfach die Prozedur eine Nachricht in der Warteschlange gestellt, wenn etwas kommt, können Sie dann die Warteschlange aus dem Haupt pygame Prozess abfragen alle Nachrichten zu erhalten, die in gekommen ist.

Es ist ein bisschen weniger sauber als Sie vielleicht gefallen, aber zumindest werden sie die beiden Module auf Armlänge bekommen, so dass sie nicht miteinander interferieren können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top