python - 多线程 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 上下文当前
我该如何处理?
解决方案
根据SDL 常见问题解答(Pygame 包装 SDL),您不能依赖可从多个线程访问的图形。您必须将所有绘图转移到主线程。您仍然可以让线程运行其他逻辑。
请注意,他们说“主线程”。通常使用锁是不够的。例如,您可以设置一个队列,其中包含要在主线程上运行的作业,并提供该队列,只要其中的作业可以在不同的线程中安全运行(例如,在他们需要知道什么的状态周围用锁保护画)。
推荐阅读
- sql-server - 对象名称“AMAPHLINK.Payroll.dbo.EmpResignTb”包含的前缀数量超过了最大数量。最大值为 2
- javascript - 在加载的网页顶部添加一个按钮
- java - 编写一个程序,将用户的输入作为数组接收,并将其与另一个数组进行比较,以使用 while 循环检查正确答案
- java - 从 Windows (DOS) shell 运行 Eclipse Java Maven 项目
- reactjs - 如何使用异步请求的响应初始化 Redux 状态
- assembly - 8085; 为什么 RET 不需要像 CALL 那样的 6 个 T 状态 Fetch 循环?
- angular7 - 组件离开角度7后如何重置表单
- ios - 如何使用 Swift5 仅通过相机扫描某些区域?
- android - 升级 android 应用程序时要采取的措施
- cmake - 有什么方法可以在没有 cmake 的情况下构建柯南