gpt4 book ai didi

Python 诅咒、线程 : Output thread reports a lagging value for global variable

转载 作者:太空宇宙 更新时间:2023-11-03 14:17:08 24 4
gpt4 key购买 nike

我从一个带有curses的python程序开始,然后我实现了线程,一个线程接受输入(这里是A和D按钮)并相应地更改x。然后主 block 不断地将 x 的值显示到屏幕上。但是,x(全局共享变量)的值不同。特别是,主 block 测量的 x 值总是滞后于 inputThread 的值,但 inputThread 的响应是完美的。是什么赋予了?如何让主 block 读取由 inputThread 测量的 x 的真实值?

import time
import curses
import threading
from curses import wrapper
from time import sleep

def inputThread(stdscr):
global x
x = 0
while True:
c = stdscr.getch()
curses.flushinp()
if c == ord('a'):
x -= 1
elif c == ord('d'):
x += 1
stdscr.addstr("inputThread:" + str(x) + "\n" + "c:" + str(c))

def main(stdscr):
curses.initscr()
stdscr.clear()

t = threading.Thread(target=inputThread, args=(stdscr,))
t.setDaemon(True)
t.start()

while True:

stdscr.clear()
stdscr.addstr("\ndisplay window:" + str(x) + "\n")
time.sleep(0.05)

wrapper(main)

示例输出;下一次按键时,无论是 A 还是 D,显示窗口将报告 9。

最佳答案

首先,您的全局变量x应该在所有函数之外声明,但您已在inputThread函数内部声明了它。 global x 告诉我们,它将使用并更改全局变量 x 的值,而不是在函数作用域内创建另一个变量。因此 delcare 并在其他函数之外用 0 初始化 x

现在你的问题来了。假设当守护进程和主线程一起运行时,守护进程方法只是停留在 c = stdscr.getch() 等待按键,而 while 在你的内部循环。主线程中的 main 函数什么也不做,只是用文本 display window: 0 更新屏幕,您看不到它,因为屏幕在 0.05s 内变得清晰FPS 太快看不清屏幕。
现在,当您键入这些 a 或 d 键时,守护进程会更新全局变量 x 的值,但在主线程获取该值之前,它会被打印虚拟屏幕为 InputThread:*c:***,在这种情况下,主线程仅打印先前的值 0。因此,解决方法是在更新 x 后让守护线程休眠一段时间,同时主线程内的循环将导致显示新更新的 x 值。这可以通过以下方式完成:

import time
import curses
import threading
from curses import wrapper
from time import sleep

x = 0

def inputThread(stdscr):
global x
while True:
c = stdscr.getch()
curses.flushinp()
if c == ord('a'):
x -= 1
elif c == ord('d'):
x += 1
sleep(0.05)
stdscr.addstr("inputThread:" + str(x) + "\n" + "c:" + str(c))

def main(stdscr):
curses.initscr()
stdscr.clear()

t = threading.Thread(name ='daemon', target=inputThread, args=(stdscr,))
t.setDaemon(True)
t.start()

while True:
stdscr.clear()
stdscr.addstr("\ndisplay window:" + str(x) + "\n")
sleep(0.05)

wrapper(main)

希望有帮助。

关于Python 诅咒、线程 : Output thread reports a lagging value for global variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48180414/

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