我开始使用带有curses的python程序,然后我实现了线程,一个接受输入(这里是A和D按钮)并相应地更改x。然后主块连续在屏幕上显示x的值。但是,x(全局共享变量)的值是不同的。特别是,由主块测量的x值总是落后于inputThread,但inputThread是完全响应的。是什么赋予了?如何使主块读取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.
答案 0 :(得分:1)
首先,您的全局变量x
应在所有函数之外声明,但您已在inputThread
函数内声明它。 global x
告诉我们不是在函数范围内创建另一个变量,而是使用和改变全局变量x
的值。因此,delcare并在其他功能之外用x
初始化0
。
现在问题来了。假设当守护进程和主线程一起运行时,守护进程方法只停留在c = stdscr.getch()
等待按键,而主线程中主函数内的while
循环只做更新但只更新由于屏幕在display window: 0
中清晰显示FPS太快而无法看到屏幕,因此您无法看到文字0.05s
。
现在,当您键入其中任一a or d
个键时,守护程序会更新全局变量x
的值,但在主线程获取该值之前,它将在虚拟屏幕上打印为{{1} }和InputThread:*
,主线程在这种情况下只打印前一个值c:***
。因此,解决方法是在更新0
之后暂停守护程序线程一段时间,因为同时主线程内的循环将导致显示新更新的x
值。这可以通过以下方式完成:
x
希望它有所帮助。