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?