2017-08-06 59 views
2

我正在研究一個包括Raspberry Pi相機在內的小項目。我正在PC上使用多處理來執行各種任務,其中一個正在Pygame窗口中顯示圖像。我有經理來最小化遭受問題的代碼。這是主要的功能,剛剛創建Game過程中,運行它,並等待其結束:Pygame與多處理混合的奇怪行爲

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

下面是Game類的代碼。該狀態是共享的,因爲會有其他進程檢查程序是否完成。

# 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 

現在的行爲是,它不會結束點擊Pygame的退出按鈕。不過,如果我註釋掉Gamerun方法pygame.quit()線,它給了我下面的消息:

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. 

我試着用搜索引擎的錯誤,但收效甚微。考慮到Pygame的窗口本身就是一個過程,我無法擺脫我嘗試不該做的事情的感覺。

我希望在哪裏讀了

+3

我從來沒有嘗試過自己在做什麼,但我想這個問題有其中'pygame的做.init'被調用。我認爲它會在構建'Game'實例時在主進程中調用,而不是在子進程中(只有在調用'start()'時纔會啓動)。嘗試將'pygame.init'和'pygame.display.set_mode'調用移動到'run'的頂部,看看是否有效。 – Blckknght

+0

我似乎想起pygame根本無法處理多處理或線程。 – oxrock

+0

@Blckknght這似乎已經解決了這個問題 – Jytug

回答

0

由於Blckknght提出了一些見解和建議,問題是父進程(main.py)發起pygame的窗口,而子進程(game.py)試圖quit它。它可以通過這部分移動解決:

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

Gamerun方法