我有一个简单的项目,我使用带有rpi的LED灯条一次显示一个字母的消息。有时LED会随机点亮并卡住,直到显示新信息时它被清除。
我的解决方案是创建另一个线程,每隔~2秒清除一次条带,因此如果LED随机打开,它们将很快再次关闭。
我显然不希望该消息在显示消息时清除显示,因此我创建了一个全局变量来跟踪当前是否正在显示消息。
这是相关代码的精简版本:
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()
问题是,显示变量似乎不起作用。当错误清除线程检查时,程序的行为就像显示始终为false。当我需要担心竞争条件时,我习惯不得不在其他编程语言中使用锁,但老实说,我只需要按秒的顺序工作,而不是纳秒。这不是竞争条件,似乎变量缓存在每个线程上,而python没有volatile关键字。这类似于其他SO问题的建议,所以我不太确定是什么问题。有什么想法吗?
答案 0 :(得分:0)
我在while循环中声明了全局,希望避免任何缓存,但这似乎实际上有相反的效果。
从
改变一切def clear_errors():
while True:
global displaying
到
def clear_errors():
global displaying
while True:
修好了。不知道为什么会这样。