2017-08-06 2 views
2

Je travaille sur un petit projet incluant la caméra Raspberry Pi. J'utilise le multitraitement sur le PC pour effectuer diverses tâches et l'une d'entre elles affiche des images dans une fenêtre Pygame. J'ai un gestionnaire pour minimiser le code souffrant du problème. Ceci est la fonction principale, ce qui crée juste un processus Game, court et attend à la fin:Comportement bizarre de Pygame mélangé avec Multiprocessing

# main.py 

from multiprocessing import Manager 

import game 


with Manager() as manager: 
    namespace = manager.Namespace() 

    namespace.done = False 

    jobs = [ 
     game.Game(namespace), 
    ] 

    for job in jobs: 
     job.start() 

    for job in jobs: 
    job.join() 

est sous le code de la classe Game. L'état est partagé car d'autres processus vérifient si le programme est terminé.

# game.py 
import multiprocessing 
import pygame 
import time 
import sys 


class Game(multiprocessing.Process): 
    def __init__(self, the_state): 
     super(Game, self).__init__() 

     pygame.init() 
     self.screen = pygame.display.set_mode((100, 100)) 
     self.state = the_state 

    def handle_key_events(self): 
     """ Wrapper for handling key events """ 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       self.state.done = True 
       return 

    def run(self): 
     while True: 
      self.handle_key_events() 
      if self.state.done: 
       print('exiting PyGame thread') 
       pygame.display.quit() 
       pygame.quit() 
       return 

Le comportement est maintenant qu'il ne se termine pas en cliquant sur le bouton de sortie de Pygame. Cependant, si je commente la ligne pygame.quit() de la méthode de runGame, il me donne le message suivant:

exiting PyGame thread 
XIO: fatal IO error 11 (Resource temporarily unavailable) on X server ":0" 
     after 120 requests (120 known processed) with 1 events remaining. 

J'ai essayé googler cette erreur, mais peu de succès. Je ne peux pas me débarrasser du sentiment que j'essaye quelque chose que je ne devrais pas être, considérant que la fenêtre de Pygame est probablement un processus à part entière.

Je vous serais reconnaissant un aperçu et des recommandations sur l'endroit où lire

+3

Je ne l'ai jamais essayé ce que vous faites, mais je suppose que la question a à voir avec où 'pygame .init' est appelé. Je pense qu'il sera appelé dans les processus principaux quand il construit l'instance 'Game', et non dans le processus enfant (qui ne se déroule que lorsque' start() 'est appelé). Essayez de déplacer les appels 'pygame.init' et' pygame.display.set_mode' en haut de 'run' et voyez si cela fonctionne. – Blckknght

+0

Je semble me rappeler que pygame ne peut pas gérer le multiprocessing ou le threading du tout. – oxrock

+0

@Blckknght cela semble avoir résolu ce problème – Jytug

Répondre

0

Comme Blckknght a suggéré, la question était que le processus parent (main.py) a lancé la fenêtre de PyGame, alors que le processus de l'enfant (game.py) a tenté de quit il. Il peut être résolu en déplaçant cette partie:

pygame.init() 
    self.screen = pygame.display.set_mode((100, 100)) 

dans la méthode de runGame