Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过webiopi退出python中的连续循环_Python_Multithreading_Webiopi - Fatal编程技术网

通过webiopi退出python中的连续循环

通过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

我使用的是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, 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就有点过头了。