首页 > 解决方案 > 多线程 Pygame

问题描述

我正在尝试制作多线程 pygame 应用程序。这是代码示例

import threading
import numpy as np
import time
import sys
import pygame

class Test:
    def __init__(self):
        pygame.init()
        self.surface = pygame.display.set_mode((400, 300))

    def do_smth(self):
        while True:
            time.sleep(2)
            print(np.random.randint(10, 20))

    def test(self):
        p = 10
        while True:

            self.surface.fill((255, 255, 255))
            pygame.draw.rect(self.surface, (255, 0, 0), (p, 10, 70, 65))

            event = pygame.event.poll()

            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

            if event.type == pygame.MOUSEBUTTONDOWN:
                p += 10

            pygame.display.update()

如果我像这样测试它就可以了

T = Test()
T.test()

但是当我尝试使用线程执行此操作时 - 我收到错误 t = threading.Thread(target=T.test) t2 = threading.Thread(target=T.do_smth)

t.start()
t2.start()

t.join()
t2.join()

线程 Thread-1 中的异常:回溯(最后一次调用):文件“/usr/lib/python3.8/threading.py”,第 932 行,在 _bootstrap_inner self.run() 文件“/usr/lib/python3. 8/threading.py”,第 870 行,在运行 self._target(*self._args, **self._kwargs) 文件“<filename.py>”,第 34 行,在测试 pygame.display.update() pygame 中。错误:无法使 GL 上下文当前

我该如何处理?

标签: pythonmultithreadingpygame

解决方案


根据SDL 常见问题解答(Pygame 包装 SDL),您不能依赖可从多个线程访问的图形。您必须将所有绘图转移到主线程。您仍然可以让线程运行其他逻辑。

请注意,他们说“主线程”。通常使用锁是不够的。例如,您可以设置一个队列,其中包含要在主线程上运行的作业,并提供该队列,只要其中的作业可以在不同的线程中安全运行(例如,在他们需要知道什么的状态周围用锁保护画)。


推荐阅读