Esci Loop supress Tailpress in Shell / Terminal o Morsetto variabile
-
21-12-2019 - |
Domanda
Quindi sono sul mio Raspberry PI, e voglio controllare se un sensore è stato attivato. Sono potenzialmente di scadenza di due cose diverse, però, una da un guscio in cui sono remoto, e l'altro da uno schermo LCD con pulsanti di coppia direttamente collegati all'RPI. Penso che il modo migliore per farlo è quello di eseguire un anello per vedere se l'utente preme un tasto (come il tasto ENTER o qualcosa) o se l'interfaccia LCD ha selezionato per andare avanti. Mi piacerebbe eseguire un ciclo che controlla se l'utente ha premuto un tasto o se una variabile è stata modificata da qualche parte che denota l'interfaccia LCD è stata modificata e quindi andare avanti con il mio codice, ma non conosco il modo migliore per farlo Questo. Attualmente, questo è ciò che ho:
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>
.
Questo funziona, ma non sono sicuro di cosa succede al filo che è stato creato. Il filo rimane vivo dopo aver premuto una chiave? I Se modifica la variabile invece di premere un tasto, non sarà ancora il filo? Mi sentirei a tuo agio con questo se l'evento avrebbe accadito solo una o due volte, ma questo controllo di tasti / Varble potrebbe accadere 100s o 1000 di volte e non voglio continuare a iniziare nuovi fili più e più volte.
C'è un modo migliore per farlo?
Grazie per qualsiasi consiglio !!
Soluzione
Il thread che hai creato uscite quando la funzione chiamata start_new_thread
restituisce, quindi non è necessario preoccuparti di preoccuparsi per sempre (che è dalla documentazione ufficiale su thread.start_new_thread
).
Per quanto riguarda il modo "migliore" per farlo, penso che invertire ciò che viene eseguito in un filo separato e ciò che viene eseguito nella linea di esecuzione principale sarebbe utile.Cioè, funziona in un thread separato e attendere una chiave premi nel thread principale.Questo è tradizionalmente come funzionalità come questa sia implementata e riduce alcune delle complessità del tuo loop.