您处于单线程应用程序中。。这意味着,一旦您输入idleLoop(),计算机(或者至少是您的程序)就不能执行任何其他操作,包括处理您的web请求以退出空闲循环,因为它一直在闪烁LED灯并处于休眠状态。在
处理这个问题的方法是让启动和停止LED的函数只需设置一个全局变量,然后退出。。例如
blink_enabled = True或{}。在
比如:blink_enabled = False
def loop():
webiopi.sleep(1)
if blink_enabled:
blink_once()
def blink_once():
GPIO.digitalWrite(LIGHT1, GPIO.HIGH)
time.sleep(0.05)
GPIO.digitalWrite(LIGHT2, GPIO.HIGH)
GPIO.digitalWrite(LIGHT1, GPIO.LOW)
time.sleep(0.05)
GPIO.digitalWrite(LIGHT3, GPIO.HIGH)
GPIO.digitalWrite(LIGHT2, GPIO.LOW)
time.sleep(0.05)
@webiopi.macro
def stopLoop():
blink_enabled = False
@webiopi.macro
def idleLoop():
blink_enabled = True
这将允许在每次闪烁之间处理其他任务,如处理web请求。在每一次闪烁中,其他事情的处理都会被阻止一点点。。这使得这段代码不太理想。。但它为你指明了正确的方向。在一个多任务的环境中,你必须尽快完成这个任务。如果你不这样做,其他一切都会等待。在
从代码的外观来看,loop()似乎在循环,宏函数彼此独立执行。。但事实并非如此。它们相互之间来回传递控制权,每次只有一个运行。在
理想的方法是不使用时间。睡觉(),但要记下(在变量中)上次更改LED的时间。。并在loop()中检查,以查看经过了多少时间。。如果时间不够,什么也不做,下次再检查。过了足够的时间后,将LED切换到下一个状态并重置计时器。这是解决这类问题的经典方法。。称为“状态机”方法。在
当您调用sleep()时,一切都会停止,所以您需要避免这种情况。在