我有一个用Python编写的多线程程序,我在同一时间发生了很多事情:
该程序对延迟敏感,所以我真的需要这个多线程。 我得到了curses线程以正确显示我想要的内容。
问题在于,虽然我没有使用curses线程工作,但是我在main()函数中有一个“killswitch”,它在按下一个键时终止了所有活动。 我有一个名为“killThreads”的全局变量,它被用作所有被称为线程的函数,所有这些函数只能用作:
def oneThread():
while (not killThreads):
doStuff()
...
然后main函数将killThread定义为False,初始化所有线程并在raw_input()后将killThread转换为True:
killThreads=False
thisThread=threading.Thread(target=oneThread)
otherThread=threading.Thread(target=twoThread)
thisThread.setDaemon(True)
otherThread.setDaemon(True)
thisThread.start()
otherThread.start()
raw_input('Press to end the program')
killThreads=True
一切运行正常直到我使用Curses模块运行一个线程来显示数据。 似乎在Curses线程打开时,它接管所有输入命令。我试图使用getch()但没有成功。我所能做的只是在Curses函数中建立一个计时器:
def displayData():
screen=curses.initscr()
screen.nodelay(1)
timeKill=0
while (timeKill<80):
#stuff is drawn#
time.sleep(0.25)
timeKill+=1
有谁能告诉我如何查看Curses并让我的键盘输入“到达”主要功能并杀死所有线程?或者我总是要输入Curses,然后让Curses函数改变killThreads变量?如果是这样,我该怎么做(或者我在哪里找到相关文档)?
非常感谢你的帮助。
答案 0 :(得分:1)
我今天试图完成同样的事情。看看这个解决方案:
killThreads=False
thisThread=threading.Thread(target=oneThread)
otherThread=threading.Thread(target=twoThread)
thisThread.setDaemon(True)
otherThread.setDaemon(True)
thisThread.start()
otherThread.start()
raw_input('Press "q" to end the program')
key = ''
while key != ord('q'):
key = screen.getch()
killThreads=True
curses.nocbreak(); screen.keypad(0); curses.echo()
curses.endwin()
请注意,在将var while
切换为q
之前,killThreads
将非常快速地循环并等待True
按钮。
这是很常见的做法。但是,这个while
循环在第二个循环中产生了数千个空闲循环,可能会有更优雅的方式或更好地嵌入到while
循环time.sleep(0.1)
中。