通过webiopi退出python中的连续循环
我使用的是webiopi,我基本上想要的是当网页加载时,一个跟踪一些LED的空闲循环运行。然后,当有人按下网站上的按钮时,它将停止空闲循环 以下是我目前掌握的情况:通过webiopi退出python中的连续循环,python,multithreading,webiopi,Python,Multithreading,Webiopi,我使用的是webiopi,我基本上想要的是当网页加载时,一个跟踪一些LED的空闲循环运行。然后,当有人按下网站上的按钮时,它将停止空闲循环 以下是我目前掌握的情况: import webiopi import time GPIO = webiopi.GPIO LIGHT1 = 2 LIGHT2 = 3 LIGHT3 = 4 def setup(): GPIO.setFunction(LIGHT1, GPIO.OUT) GPIO.setFunction(LIGHT2, GPI
import webiopi
import time
GPIO = webiopi.GPIO
LIGHT1 = 2
LIGHT2 = 3
LIGHT3 = 4
def setup():
GPIO.setFunction(LIGHT1, GPIO.OUT)
GPIO.setFunction(LIGHT2, GPIO.OUT)
GPIO.setFunction(LIGHT3, GPIO.OUT)
a=0
def loop():
webiopi.sleep(1)
@webiopi.macro
def stopLoop():
print("Stopping Loop");
global a
a = 1
return a
@webiopi.macro
def idleLoop():
print("Entering idleLoop");
while (a==0):
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)
所以,我可以让它运行idleLoop,我有一个按钮连接起来发送stopLoop的命令,我可以看到它通过POST,但是在我的PI调试窗口中,我只看到它进入idleLoop,但它从来没有进入stopLoop。我不确定是否必须编写中断或多线程,但我只需要一些指导。谢谢 您处于单线程应用程序中。。这意味着,一旦您输入idleLoop(),机器(或至少是您的程序)就无法执行任何其他操作,包括处理您的web请求以退出空闲循环,因为它一直在闪烁指示灯和休眠 处理这个问题的方法是让启动和停止LED的函数只设置一个全局变量,然后退出。。乙二醇
blink\u enabled=True
或blink\u enabled=False
比如:
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()正在循环,并且宏函数彼此独立执行。。但事实并非如此。它们相互之间来回传递控制权,一次只能运行其中一个
理想情况下,这样做的方法是根本不使用time.sleep(),而是记下(在变量中)上次更改LED的时间。。并检入loop()以查看经过了多少时间。。如果时间不够,则什么也不做,下次再次检查。一旦足够的时间过去,翻转LED到下一个状态并重置计时器。这是解决这类问题的经典方法。。称为“状态机”方法
当你调用sleep()时,一切都停止了,所以你要避免这种情况。谢谢,我知道我以前做过这件事,但我已经不习惯了。你举的例子正是我应该记住的。谢谢不客气。理论上,你可以通过真正的多任务处理来解决这个问题,但仅仅眨几下LED就有点过头了。