Python curses,threading:输出线程报告全局变量

时间:2018-01-10 04:40:42

标签: python multithreading python-curses

我开始使用带有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.

1 个答案:

答案 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

希望它有所帮助。