2017-10-15 154 views
1

我有一个带有Sense帽子的树莓派。我制作了一个binary clock,我想在Sense帽子的显示屏上显示并保持更新。不过,我希望能够用操纵杆中间打开和关闭时钟。一切工作正常,除了我的时钟的更新循环阻止任何新的输入一旦开始。无阻塞无限循环

from sense_hat import SenseHat 
from signal import pause 

def show_clock(): 
    # clock-logic 

def pushed_middle(event): 
    while 1: 
     show_clock() 

sense = SenseHat() 

sense.stick.direction_middle = pushed_middle 
pause 

我一直在想如何解决这个问题。如何让脚本/时钟继续运行并仍然接受来自操纵杆的新操作。但是,一旦循环开始,我就卡住了。我不知道要谷歌什么。我已经开始研究异步/等待,但这似乎是一个Python 3.5+功能,而我的pi只有2.7.9/3.4.2(我只是sudo apt-get update/upgrade -ed)。我也尝试过在程序中移动循环,但无论我把它放在哪里,它都会阻塞一切。

  • 这是一个非阻塞(无限)循环我在找什么?
  • 这是什么游戏/事件循环?
  • 我可以使用多线程解决这个问题吗(只是好奇而不是限制,如果它是必须的)?
  • 这是“设计”无限循环中的一个普遍问题吗?
  • 我可以将此作为(反向?)竞争条件吗?我在考虑使用信号量作为某种工具来阻止,但我不确定。
+0

见Python的[**'signal' **](https://docs.python.org/3/library/ signal.html)库 –

+0

@PeterWood我正在看'signal',但认为这是过度杀伤,主要是操作系统的东西。但是,我不确定如何确定操纵杆发送的信号类型(如果有的话)。我将如何去确定这一点? – mhrvatin

回答

0

我解决它通过使用一个全局变量:

from sense_hat import SenseHat 
from signal import pause 

def show_clock(): 
    global clock_is_on 

    while clock_is_on: # clock-loop 
     # clock-logic 
     # ... 

     events = sense.stick.get_events() 

     for event in events: 
      if event.direction == "middle" and event.action == "pressed": 
       clock_is_on = False 

     time.sleep(1) # only need to update clock once every second 

def pushed_middle(event): 
    if not clock_is_on: 
     clock_is_on = True 
     show_clock() 

sense = SenseHat() 

clock_is_on = False 

sense.stick.direction_middle = pushed_middle 
pause()