我编写了一个非常简单的程序,该程序具有多个线程,应该将其输出到终端。一个线程打印出一个由10个星号组成的数组,另一个线程应该在后台运行,以等待检测到任何键盘按下情况。我无法解决的是,如果第二个线程正在运行,则终端中的输出无法正确打印出来。如果第二个线程停止了,则输出是所需的。
完整代码(根据要求):
#ASCII Frogger
from random import randint
import time
import sys, termios, tty, os
import threading
def getch():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
def resetPositions():
pos = ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*"]
return pos
def threadKeyPressDetection():
button_delay = 0.2
while True:
char = getch();
if (char == "p"):
#print("Stop!")
exit(0)
def threadGame():
positions = ["*", "*", "*", "*", "*", "*", "*", "*", "*", "*"]
startingPos = randint(0, 9)
frogPosition = startingPos
i = 0
ii = 0
while i < 10:
# if player press left go down in grid if space
# if player press right go up in grid if space
while ii < 10:
if i < 5:
positions[4] = (5 - i)
print positions[ii],
ii += 1
ii = 0
if i == 5:
print "\n\n\n GO "
print "\n"
positions = resetPositions()
if i > 5:
positions[frogPosition] = '!'
i += 1
time.sleep(1)
try:
t1 = threading.Thread(target=threadKeyPressDetection)
t2 = threading.Thread(target=threadGame)
t1.start()
t2.start()
t1.join()
t2.join()
except:
print("Error occured - unable to start thread")
所需的输出:
* * * * 3 * * * * *
* * * * 2 * * * * *
* * * * 1 * * * * *
GO
* * * * * * * * * *
* * * * * * ! * * *
当前输出:
* * * * 5 * * * * *
* * * * 4 * * * * *
* * * * 3 * * * * *
* * * * 2 * * * * *
* * * * 1 * * * * *
* * * * * * * * * *
GO
答案 0 :(得分:1)
问题发生在这里:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
将tty设置为原始模式,然后让其等待读取字符。当该线程等待输入时,另一个线程继续输出。它以tty原始模式继续输出。您可以通过将getchr()更改为just
来检查这是否是错误。def getchr():
tty.setraw(sys.stdin.fileno())
exit(0)
这会将tty置于原始模式,然后立即终止线程。使用此方法,即使只有1个线程正在运行,您仍将获得相同的不需要的输出。
最简单的解决方法是使用here中的方法。
答案 1 :(得分:-1)
需要将tty.setraw
更改为tty.setcbreak