2017-10-15 155 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()