2017-10-15 10 views
1

私はセンセンスハットのラズベリーパイを持っています。私はを作成し、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 

私はこれを解決する方法について考えてきました。スクリプト/クロックを実行したままで、ジョイスティックから新しいアクションを受け入れる方法。しかし、whileループが始まると、私は立ち往生しています。私はgoogleのために何がわからない。私はasync/awaitを調べ始めましたが、それは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)library –

+0

@PeterWood私は 'signal'を見ていましたが、それが過度のものであり、主にOSのものだと思っていました。しかし、ジョイスティックが送信している信号の種類を判断する方法がわからない。これを決めるにはどうすればいいですか? – 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()