2017-09-29 4 views
0

J'utilise le threading python pour vérifier la modification d'une valeur dans une base de données SQL locale. J'ai la gestion des erreurs sur le programme principal pour gérer un raccourci clavier Ctrl + C. Cela arrête le code principal mais le thread continue. Comment dois-je arrêter le thread proprement quand ctlr + c est pressé. Merci. discussion est le suivant:Arrêtez proprement un thread python à la sortie du clavier.

def getVars(): 
    global setTemp 
    global pidControl 
    while True: 
     dB = MySQLdb.connect(host="localhost", 
          user="pythonUser", 
          passwd="password123", 
          db="pythonProg") 

     cur = dB.cursor() 
     cur.execute("SELECT * FROM PiBQ_Temp WHERE tempKey = 1") 
     for field in cur: 
      fetchTemp = field[1] 
      print ("Thread getVars checked temp: " + fetchTemp) 

     # Check to see if fetchTemp is different to setTemp and update pid if needed 
     if fetchTemp != setTemp: 
      setTemp = fetchTemp 
      pidControl.setPoint(setTemp) 
     time.sleep(5) 

Il est appelé au sein de la principale déclaration try: par ceci:

# Start the getVars thread 
t = threading.Thread(target=getVars, args=()) 
t.start() 
print "Thread started: getVars" 

La gestion des erreurs est la suivante:

except (KeyboardInterrupt, SystemExit): 
    os.system('clear') 
    print ('ctrl+C pressed. \nProgramme complete') 
    dB.commit() 
    dB.close() 
    screen.lcd_cleanup() 
    GPIO.cleanup() 

Répondre

1

Une façon habituelle est de créer un variable globale, par exemple pendingExit = False et le définir à True dans le gestionnaire except puis join le thread de travail pour attendre sa fin.

Le thread de travail dans getVars doit ensuite vérifier périodiquement pendingExit et se terminer.