gpt4 book ai didi

python - 在pygame中使用线程

转载 作者:太空狗 更新时间:2023-10-30 02:32:02 25 4
gpt4 key购买 nike

我有一个树莓派,并且在我发送脉冲的一个 gpio 引脚上,因此我有 python 代码来检测该引脚上的中断,并且它们每秒最多有 2 个中断。现在我想将这个值(中断总数)传递给 pygame 应用程序。

目前检测中断的python代码写总数没有。当检测到中断时将中断写入文件,然后 pygame 应用程序从文件中读取该编号。因此,我的问题是如何使用线程在 pygame 中集成中断检测代码,因为我希望 pygame 应用程序和中断检测代码并行运行。我在某处读到 pygame 不是线程安全的。

我的中断检测代码:

GPIO.setmode(GPIO.BCM)
count = 0
GPIO.setup(2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def my_callback(channel):
file = open('hello.txt','w')
global count
count += 1
file.write(str(count))
GPIO.add_event_detect(2,GPIO.BOTH, callback=my_callback)

while True:
print "Waiting for input."
sleep(60)
GPIO.cleanup()

pygame应用程序代码:

pygame.init()
size=[640,640]
screen=pygame.display.set_mode(size)
pygame.display.set_caption("Test")
done=False
clock=pygame.time.Clock()
font = pygame.font.SysFont("consolas", 25, True)
frame_rate = 20
frame_count = 0
count = 0
while done == False:
for event in pygame.event.get(): # User did something
if event.type == pygame.QUIT: # If user clicked close
done=True # Flag that we are done so we exit this loop
pygame.quit()
sys.exit()

f = open("hello.txt", "r")
count = int(f.read())
output_string = "ACTUAL %s" %count
text = font.render(output_string,True,red)
screen.blit(text, [250,420])
frame_count += 1
clock.tick(frame_rate)
pygame.display.flip()

pygame.quit ()

最佳答案

您可以使用例如线程安全 Queue类让您的线程相互通信。

quick'n'dirty 示例:

import pygame
from pygame.color import Color
from Queue import Queue
from threading import Thread

q = Queue()

def worker():
GPIO.setmode(GPIO.BCM)
GPIO.setup(2, GPIO.IN, pull_up_down=GPIO.PUD_UP)
def my_callback(channel):
q.put(True)
GPIO.add_event_detect(2,GPIO.BOTH, callback=my_callback)

while True:
print "Waiting for input."
sleep(60)
GPIO.cleanup()


t = Thread(target=worker)
t.daemon = True
t.start()

pygame.init()

screen = pygame.display.set_mode([640,640])
clock = pygame.time.Clock()
font = pygame.font.SysFont("consolas", 25, True)
count = 0
pygame.display.set_caption("Test")

done = False
while not done:
screen.fill(Color('black'))
for event in pygame.event.get(): # User did something
if event.type == pygame.QUIT: # If user clicked close
done = True
try:
q.get()
count += 1
except: pass
output_string = "ACTUAL %s" % count
text = font.render(output_string, True, Color('red'))
screen.blit(text, [250,420])
clock.tick(20)
pygame.display.flip()

关于python - 在pygame中使用线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20519420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com