2017-10-16 3 views
0

J'ai un projet simple où j'affiche les messages une lettre à la fois en utilisant une bande de LED avec mon rpi. Parfois, les voyants s'allument de manière aléatoire et restent bloqués jusqu'à ce qu'ils soient effacés lors de l'affichage d'un nouveau message.Variable partagée simple python multithread

Ma solution consiste à créer un autre fil pour effacer la bande une fois toutes les ~ 2 secondes, donc si les voyants s'allument de manière aléatoire, ils seront rapidement désactivés.

Je ne souhaite évidemment pas que ce thread efface l'affichage pendant l'affichage d'un message, j'ai donc créé une variable globale pour savoir si un message est actuellement affiché.

est ici une version dépouillée du code correspondant:

displaying = False 


def display(msg): 
    global displaying 
    displaying = True 
    for c in msg: 
     turn_all_leds_off() 
     display_char(c) 
     time.sleep(1) 
     turn_all_leds_off() 
     time.sleep(.2) 
    time.sleep(1) 
    displaying = False 


def listen_on_client(): 
    while True: 
     global displaying 
     if not displaying: 
      get_new_messages_from_server_and_display_them() 
     time.sleep(2) 


def clear_errors(): 
    while True: 
     global displaying 
     if not displaying: 
      display(" ") 
     time.sleep(2) 


t1 = Thread(target=listen_on_client, args=()) 
t2 = Thread(target=clear_errors, args=()) 
t1.start() 
t2.start() 

le problème, la variable affichage ne semble pas fonctionner. Le programme se comporte comme si l'affichage est toujours faux quand le thread d'effacement d'erreur le vérifie. J'ai l'habitude d'avoir à utiliser des verrous dans d'autres langages de programmation quand j'ai besoin de m'inquiéter des conditions de course, mais honnêtement, j'ai juste besoin de cela pour travailler de l'ordre des secondes, pas des nanosecondes. Ce n'est pas une condition de concurrence, il semble que la variable est mise en cache sur chaque thread et python n'a pas de mot clé volatile. Ceci est similaire à la façon dont d'autres questions SO ont suggéré de le faire, donc je ne suis pas tout à fait sûr de ce qui ne va pas. Des idées?

Répondre

0

J'ai déclaré le global dans les boucles while pour éviter toute mise en cache, mais cela semblait avoir l'effet inverse.

tout changement de

def clear_errors(): 
    while True: 
     global displaying 

à

def clear_errors(): 
    global displaying 
    while True: 

fixé il. Je ne sais pas pourquoi.