我从一个带有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/