gpt4 book ai didi

Python - 使用多处理和按键检测

转载 作者:行者123 更新时间:2023-12-02 17:43:03 26 4
gpt4 key购买 nike

我在使用多处理模块中的 Process 时遇到问题。不幸的是,在我以前创建一个线程并且一切正常之前,我不得不进行更改以优化性能。

这是我玩游戏的代码,它基本上使用计算机视觉进行对象检测,并通过使用单独的进程来启动游戏。

#opecv infinite loop for frames processing
while True:

# detect object, code omitted

k = cv2.waitKey(20) & 0xFF

# when user press key 's' start the game
if (k == ord('s') or k == ord('S')) and start is False:
start = True
info = False
# # t = Thread(target=playGame, args=(k,))
# # t = Thread(target=playGame)
# # t.start() with threads worked successfully
p = Process(target=playGame)
p.start()

# if user press 'p' capture marker position and set boolean flag to true
elif k == ord('p') or k == ord('P'):
waitForUserMove = True

这是我的 playGame()包含游戏循环的函数:
def playGame():
#omitted code
while gameIsPlaying:
getUserMove()

#rest of code

最后这是我的 getUserMove()包含 while 循环以等待用户移动的函数:
def getUserMove():
while waitForUserMove is False:
pass

所以基本上当用户移动并按下键'p'时,它会更改 bool 标志 waitForUserMoveTrue并自动从 while 循环中中断,执行其余代码。

正如我在使用线程之前所说的一切正常,现在我用线程替换进程我遇到了这个问题, bool 标志 waitForUserMove更改为 true,但由于某些原因,流程无法接收此信息。

换句话说,一旦用户按下“p”键, bool 标志 waitForUserMove 就会改变。至 True就在进程之外,在进程内部这个 waitForUserMove仍然是 False .

那么我该怎么做才能将此信息发送到进程以更改标志 waitForUserMove来自 FalseTrue ?

我希望很清楚,我找不到更好的词来写我的问题。预先感谢您的帮助。

最佳答案

多处理从根本上不同于线程。在多进程中,两个进程有一个单独的内存地址空间,所以如果一个进程写入他的内存,兄弟进程就看不到变量的变化。

要在不同进程之间交换数据,您应该引用 Exchanging Objects Between Processes

在您的情况下,您只有一种方式的通信,因此队列应该可以工作:

设置队列:

q = Queue()
p = Process(target=playGame, args=(q,))

发送 playGame:
def playGame(q):
#omitted code
while gameIsPlaying:
move = getUserMove()
q.put(move)

在主进程中接收:
def getUserMove():
move = q.get()

请注意 q.get()正在阻塞,这意味着主进程被阻塞,直到 playGame在队列中添加一些东西。如果您需要同时做一些事情,请使用 q.get_nowait()

关于Python - 使用多处理和按键检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41792866/

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