2017-10-15 9 views
1

J'ai un pi de framboise avec un chapeau de sens. J'ai fait un binary clock que je veux afficher et garder à jour sur l'affichage du chapeau de Sense. Cependant, je veux la possibilité d'activer et de désactiver l'horloge avec le joystick au milieu. Tout fonctionne bien, mis à part la boucle de mise à jour de mon horloge qui bloque toute nouvelle entrée une fois démarrée.non-blocage boucle infinie

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 

J'ai réfléchi à la façon de résoudre ce problème. Comment autoriser le script/l'horloge à continuer à fonctionner et à accepter de nouvelles actions depuis le joystick. Mais une fois que la boucle while commence, je suis coincé. Je ne suis pas sûr de quoi google pour. J'ai commencé à regarder async/await, mais cela semble être une fonctionnalité de Python 3.5+, et mon pi a seulement 2.7.9/3.4.2 (j'ai juste sudo apt-get update/upgrade -ed). J'ai aussi essayé de faire bouger la boucle dans le programme, mais ça bloque tout, peu importe où je le place.

  • Est-ce une boucle non-bloquante (infinie) que je cherche?
  • Est-ce que une boucle événement jeu-/est?
  • Puis-je résoudre ce avec l'aide de plusieurs threads (juste curieux, pas une limitation si elle est un must)?
  • Est-ce un problème général dans « la conception » des boucles infinies?
  • Puis-je aborder cela comme un (inverse?) Condition de course? Je pensais peut-être utiliser un sémaphore comme une sorte d'outil pour ne pas bloquer, mais je ne suis pas sûr.
+0

Voir Python de [** 'signal' **] (https://docs.python.org/3/library/ signal.html) library –

+0

@PeterWood Je regardais 'signal' mais je pensais que c'était trop, et surtout OS-stuff. Cependant, je ne suis pas sûr de savoir comment déterminer le type de signal que le joystick envoie, le cas échéant. Comment ferais-je pour le déterminer? – mhrvatin

Répondre

0

Je l'ai résolu en utilisant une variable globale:

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()