在Shell / Terminal或变量更改中,在按键上退出循环

时间:2014-01-09 15:34:15

标签: python multithreading shell loops raspberry-pi

所以我在我的Raspberry pi上,我想检查传感器是否已被激活。我可能会运行两种不同的东西,一种来自我远程进入的外壳,另一种来自LCD屏幕,其中几个按钮直接连接到RPi。我认为最好的方法是运行循环以查看用户是否按下了某个键(如输入键或其他内容)或者是否已选择继续使用LCD界面。我想运行一个循环,检查用户是否按下了某个键,或者某个变量是否已更改,表示LCD界面已更改,然后继续使用我的代码,但我不知道最好的方法这个。目前,这就是我所拥有的:

import thread
import time
import globals #this is where i keep my project wide global variables. it this this is a good way to do it.... 

try:
    from msvcrt import getch
except ImportError:
    def getch():
        import sys, tty, termios
        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

char = None

def keypress():
    global char
    char = getch()

thread.start_new_thread(keypress, ())

globals.LCDVar = 0
while True:
    if char is not None:
        print "Key pressed is " + char
        break
    if globals.LCDVar == 1
      break
    time.sleep(.1)
    print "Program is running\n" 

<Run whatever code next>

这有效,但我不确定创建的线程会发生什么。按下一个键后线程是否保持活动状态?我如果更改变量而不是按键,那么线程是否仍然存在?如果事件只发生一次或两次,我会感到很自在,但这次按键/变量检查可能会发生100次或1000次,而且我不想一遍又一遍地开始新的线程。

有更好的方法吗?

感谢您的任何建议!!

1 个答案:

答案 0 :(得分:1)

start_new_thread中调用的函数返回时,您创建的线程退出,因此您不必担心它会永远运行(来自thread.start_new_thread上的官方文档)。

就“最佳”方式而言,我认为颠倒在单独线程中运行的内容以及在主要执行线中运行的内容将会有所帮助。也就是说,在单独的线程中工作并等待主线程中的按键操作。传统上,这是如何实现这样的功能,它减少了循环的一些复杂性。